我需要从我们的 MS SQL Server 数据库中提取有关房屋(即房屋)和居住在那里(或仍然居住在那里)的帐户(即人)以及他们在该房屋的服务期限的数据。
我必须考虑三种类型的情况:
最后一个场景是我遇到问题并需要一些帮助。
数据库的 account_service 表中的字段列出了“从”和“到”日期。为了展示数据库中的情况,我将列出与上述三种情况相对应的数据:
Premise# - Account# - From Date - To Date -- (details on the data)
1. 00125466, 146732, 2/2/2001, NULL (no to_date since still living there)
2. 10085279, 180887, 6/12/1978, 1/15/2020 (moved in and moved out)
3. 00005110, **267110**, 10/15/2020, 12/14/2021 (live there from Oct. 2020 - Dec. 2021)
3a.00005110, 273341, 12/14/2021, 12/09/2022 (live there from Dec. 2021 - Dec. 2022)
3b.00005110, **267110**, 12/09/2022, NULL (moved in Dec. 2022 and still there now)
使这一切变得复杂的是,account_service 表列出了帐户持有者在该场所期间活动的所有服务。这可以是水、下水道、垃圾等。
我也只对过去三年内拥有(或曾经)提供过服务的帐户感兴趣。
我的 SQL 看起来像这样:(仅查看上面的 #3 场景)
SELECT DISTINCT TOP (100) PERCENT dbo.servicelocation.propertynumber, dbo.account.accountnumber, dbo.accountservice.fromdate, dbo.accountservice.todate
FROM dbo.account INNER JOIN
dbo.accountservice ON dbo.account.account_id = dbo.accountservice.account_id INNER JOIN
dbo.service ON dbo.accountservice.service_id = dbo.service.service_id INNER JOIN
dbo.servicelocation ON dbo.service.servicelocation_id = dbo.servicelocation.servicelocation_id
WHERE (dbo.servicelocation.propertynumber = '00005110') AND (dbo.accountservice.todate > CONVERT(DATETIME, '2021-01-01 00:00:00', 102)) OR
(dbo.servicelocation.propertynumber = '00005110') AND (dbo.accountservice.todate IS NULL)
ORDER BY dbo.accountservice.fromdate DESC
上面 SQL 的输出如下所示:
理想情况下,我希望第一行是第四行,然后是第五行作为最后一行:
作为参考,SQL 视图如下所示:
软件中的数据如下所示:
我希望这能充分解释我所追求的内容,但如果需要更多信息,请告诉我。 谢谢!
[编辑 - 更多说明] 理想情况下,我希望每个前提和帐户的 MIN(from_date) 和 MAX(to_date) 。当只有一名居民时,这是可行的,但当我们有多名租户搬入和搬出时,情况很快就会变得复杂。 我的查询将列出这两个帐户(针对场景#3),但只会显示从 2020 年 10 月 15 日至今居住在那里的 267110 个帐户,因为他们仍然在那里。这会产生一个问题,因为当时有 273341 人住在那里。我们不能在同一时间段内有两个住户/帐户。
我已经在视图上尝试了各种排列...在某些情况下使用 MAX(to_date) 有帮助,但错过了前面描述的场景#3。 我认为这是可能的,但我很难想出正确的 SQL。
如果我们按[起始日期]排序并添加一个为每个房产+帐户重置的行计数器,我们可以识别各个占用期。
SELECT DISTINCT TOP (100) PERCENT propertynumber, dbo.account.accountnumber, dbo.accountservice.fromdate,dbo.accountservice.todate,
ROW_NUMBER() OVER(PARTITION BY dbo.servicelocation.propertynumber+dbo.account.accountnumber ORDER BY FromDate DESC) as OccupationSequence
FROM dbo.account
INNER JOIN dbo.accountservice ON dbo.account.account_id = dbo.accountservice.account_id
INNER JOIN dbo.service ON dbo.accountservice.service_id = dbo.service.service_id
INNER JOIN dbo.servicelocation ON dbo.service.servicelocation_id = dbo.servicelocation.servicelocation_id
房产号码 | 账号 | 自日期 | 今天 | 职业顺序 |
---|---|---|---|---|
00005110 | 267110 | 2020-10-15 | 2021-12-14 | 2 |
00005110 | 267110 | 2022-12-09 | 空 | 1 |
00005110 | 273341 | 2021-12-14 | 2022-12-09 | 1 |
房产号码 | 账号 | 最小从 | 最大 |
---|---|---|---|
00005110 | 267110 | 2022-12-09 | 空 |
00005110 | 273341 | 2021-12-14 | 2022-12-09 |
00005110 | 267110 | 2020-10-15 | 2021-12-14 |