SQL 查询 - 需要帮助列出一段时间内的场所和帐户

问题描述 投票:0回答:1

我需要从我们的 MS SQL Server 数据库中提取有关房屋(即房屋)和居住在那里(或仍然居住在那里)的帐户(即人)以及他们在该房屋的服务期限的数据。

我必须考虑三种类型的情况:

  1. 最基本的情况是一个人搬进来,开始服务并且仍然住在那里
  2. 下一个案例是某人搬进来,接受过一段时间的服务,但随后搬出并且不再居住在该位置
  3. 最后一种情况是有人搬进来,接受服务,搬出去(结束服务),然后又搬回来(想想公寓生活)。

最后一个场景是我遇到问题并需要一些帮助。

数据库的 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。

sql sql-server date max distinct
1个回答
0
投票

如果我们按[起始日期]排序并添加一个为每个房产+帐户重置的行计数器,我们可以识别各个占用期。

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
© www.soinside.com 2019 - 2024. All rights reserved.