【问题标题】:SQL find next unique date and subaccount per accountSQL 查找每个帐户的下一个唯一日期和子帐户
【发布时间】:2021-11-03 18:27:44
【问题描述】:

此查询有一些要求。基本思想是,对于每个帐户,在感兴趣的子帐户之后拉下一个 admission_date 和相应的discharge_date。如果没有唯一的下一个 admission_date,请指明“No Readmit”。

我知道 StackOverflow 不鼓励使用图片,但我觉得视觉辅助很有帮助。感兴趣的帐户是 AAA、BBB、CCC 和 DDD,感兴趣的子帐户是 121、214、315、414 和 416。请注意,CCC 没有下一个唯一的 admission_date(将是“No Readmit”),DDD 有两个子帐户具有下一个唯一的 admission_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() 的组合来标记每个 admission_date(由帐户分区)的第一个新实例,以及 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

【问题讨论】:

  • 不鼓励使用图像的原因之一是依赖屏幕阅读器的人根本无法“看到”图像。您可以添加图像,但您应该确保它也在文本中。这意味着您所追求的结果目前并非所有人都可读。还有很多人在防火墙后面,imgur 被简单地阻止了。

标签: sql common-table-expression row-number


【解决方案1】:

希望这是您正在寻找的:

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'。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多