如何从SQL中的一组行中选择特定行

时间:2020-10-22 22:34:03

标签: sql datetime subquery snowflake-cloud-data-platform hierarchical-data

我需要从准入数据的“集合”中选择特定的行。我花了一些时间来尝试理解该过程,并尝试通过一个示例来解释我需要实现的目标。

因此,在下面,我有特定成员入院和再入院的历史。我们可以将图像中的以下行分类为不同的准入集。

每项新的录取都会被授予CLM_NBR,如果出于某种原因重新注册该成员,则作为前一次录取的后续措施,初始录入/重新录取的READMIT_CLM_NBR接纳等于新的相关重新接纳的CLM_NBR。我们称集合的第一个入场为原始入场。

如果录取没有重新录取,则READMIT_CLM_NBR将是NULL

录取集如下:

准入组1 :行号4

准入组2 :第6、7、8行

准入组3 :第5、1、3、2行

enter image description here

现在,我需要在最后一个接纳集(接纳集3)中获得原始接纳的DATE_ADMITTED。突出显示的行是我们需要的行,查询应返回2016-05-18作为值。我试图找出一种按日期进行分区或分组的方法,但是似乎没有任何效果。

由于我们只关心是否有相应的重新入场,因此可以丢弃所有带有NULL READMIT_CML_NBR的行。查询应如下所示:

select READMIT_CLM_NBR, CLM_NBR, DATE_ADMITTED 
from P_Admission 
where READMIT_CLM_NBR in (select distinct CLM_NBR from P_Admission) and MBR_ID = '0610297305';

查询然后返回以下结果...

enter image description here 2

我需要从突出显示的行中获取日期。关于如何做到的任何想法?

2 个答案:

答案 0 :(得分:1)

您应该能够通过找到所有CLM_NBR而不是READMIT_CLM_NBR的值来获得所需的结果(因此它们是原始准入);然后可以按DATE_ADMITTED对这些行进行排序,并选择最近日期的行:

WITH CTE AS (
    SELECT READMIT_CLM_NBR, CLM_NBR, DATE_ADMITTED,
           ROW_NUMBER() OVER (ORDER BY DATE_ADMITTED DESC) AS rn
    FROM P_Admission p1
    WHERE MBR_ID = '0610297305'
      AND NOT EXISTS (SELECT * FROM P_Admission p2 WHERE p2.READMIT_CLM_NBR = p1.CLM_NBR)
) 
SELECT READMIT_CLM_NBR, CLM_NBR, DATE_ADMITTED
FROM CTE
WHERE rn = 1

演示(适用于MySQL 8,但适用于通用SQL)on db-fiddle

答案 1 :(得分:1)

如果我正确遵循此操作,则可以使用not exists

select max(date_admitee)
from p_admission pa
where 
    mbr_id = '0610297305'
    and readmit_clm_nbr is not null
    and not exists (
        select 1
        from p_admission pa1
        where pa1.readmit_clm_nbr = pa.clm_nbr
    )