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'
。
此查询有一些要求。基本思路是,对于每个账户,拉取下一个 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'
。