SQL 查找每个帐户的下一个唯一日期和子帐户

SQL find next unique date and subaccount per account

此查询有一些要求。基本思路是,对于每个账户,拉取下一个 admit_date 和对应的 discharge_date after 感兴趣的子账户。如果没有下一个 admit_date 是唯一的,请指示“No Readmit”。

我知道 Whosebug 不鼓励使用图片,但我觉得视觉辅助工具很有帮助。感兴趣的账户是 AAA、BBB、CCC 和 DDD,感兴趣的子账户是 121、214、315、414 和 416。请注意,CCC 没有下一个唯一的 admit_date(将是“No Readmit”),DDD有两个感兴趣的子账户,下一个唯一 admit_dates,并且子账户不一定按数字顺序排列(即 BBB 从 221 开始到 216 结束)。所以改造这个:

为此:

设置代码如下:

CREATE TABLE random_table

  (
  account VarChar(50),
subaccount VarChar(50),
admit_date DATETIME,
discharge_date DATETIME
 );

 INSERT INTO random_table
 VALUES
  ('AAA',111,6/20/2021,6/25/2021),
('AAA',121,6/20/2021,6/25/2021),
('AAA',131,7/1/2021,7/3/2021),
('AAA',141, 8/2/2021, 8/5/2021),
('BBB',216,4/1/2021,4/3/2021),
('BBB',213,4/1/2021,4/3/2021),
('BBB',221,4/1/2021,4/3/2021),
('BBB',215,4/1/2021,4/3/2021),
('BBB',216,4/5/2021,4/10/2021),
('CCC',313,11/1/2020,11/5/2020),
('CCC',314,11/15/2020,11/17/2020),
('CCC',315,12/23/2020,12/24/2020),
('CCC',316,12/23/2020,12/24/2020),
('DDD',414,7/1/2021,7/3/2021),
('DDD',412,7/6/2021,7/7/2021),
('DDD',416,8/1/2021,8/5/2021),
('DDD',417,8/10/2021,8/15/2021)

为了解决这个问题,我一直在尝试使用 row_numbers() 的组合来标记每个 admit_date (按帐户分区)的第一个新实例,以及select 那些相关行的 CTE。但显然还没有。有什么建议么?这是我拥有的:

select
    cte2.*
    ,case when cte2.subaccount in (111,121,131,141,216,213,221,215,216,313,314,315,316,414,412,416,417
    ) then lead(cte2.admit_date) over (order by cte2.account, cte2.row_nums)
          else null
          end second_admit
    from (
    select
        cte.*
        ,row_number() over (partition by cte.account order by  cte.row_num) row_nums
        from (
                select distinct
                hsp.subaccount
                ,row_number() over (partition by pat.account, hsp.admit_date order by pat.account) row_num
                ,case when row_number() over (partition by pat.account,hsp.admit_date order by pat.account) =1 then 'New Admit' else null end new_admit
                ,convert(varchar,hsp.admit_date,101) adm_date
                ,convert(varchar,hsp.discharge_date,101) disch_date
                ,pat.account
                from hsp_account hsp 
                left join patient pat on hsp.pat_id=pat.pat_id
                where pat.account in ('AAA','BBB','CCC','DDD')
                ) cte
        where cte.new_admit = 'New Admit'
        ) cte2

希望这就是您要找的:

with AI as
(
  select * from 
    (values ('AAA'), ('BBB'), ('CCC'), ('DDD')) A(account)
),
SI as
(
  select * from 
    (values (121), (214), (221), (315), (414), (416)) A(subaccount)
),
T as
(
  select * from random_table 
    where account in (select * from AI)
),
N as
(
  select
    T1.account,
    T1.subaccount,
    T1.admit_date,
    T1.discharge_date,
    T2.subaccount next_subaccount,
    T2.admit_date next_admit_date,
    T2.discharge_date next_discharge_date,
    row_number() 
      over(
        partition by T1.account, T1.subaccount 
        order by T2.admit_date) group_id
  from
    T T1
    left join
    T T2
    on
      T1.account = T2.account and
      T1.admit_date < T2.admit_date
  where
    T1.subaccount in (select * from SI)
)
select 
  account, subaccount, admit_date, 
  next_subaccount, next_admit_date, next_discharge_date
from N 
where
  N.group_id = 1

请注意,我打印的是 NULL 而不是 'No Readmit'