【问题标题】:How to select a specific row from a set of rows in SQL如何从 SQL 中的一组行中选择特定行
【发布时间】:2020-10-22 22:34:03
【问题描述】:

我需要从“一组”录取数据中选择一个特定的行。我花了一些时间来尝试理解这个过程,我将尝试通过一个示例来解释我需要实现的目标。

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

每个新入会都将获得一个CLM_NBR,如果会员由于某些原因被重新入会,作为上一次入会的后续行动,初始入会/重新入会的READMIT_CLM_NBR 等于新的相关重新录取的CLM_NBR。我们将集合的第一次准入称为原始准入。

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

录取集如下:

入场集 1:第 4 行

入场集 2:第 6、7、8 行

入场集 3:第 5、1、3、2 行

现在,我需要在最后一个准入集(准入集 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';

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

2

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

【问题讨论】:

  • 接受了其中一个答案作为解决方案。现在两者都是正确的!谢谢提醒

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


【解决方案1】:

您应该能够通过查找所有不也是READMIT_CLM_NBRCLM_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

【讨论】:

    【解决方案2】:

    如果我没看错的话,你可以使用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
        )
    

    【讨论】:

    • 很遗憾,这个查询没有返回正确的日期。它返回 2016-03-23 而不是 2016-05-18。
    • @ElDj:那将是令人惊讶的。 2016-03-23 在readmit_clm_nbr 中有一个null 值,查询专门过滤掉了这样的行。
    • 你是对的。查询返回 null。我认为该查询应该有效。 db-fiddle.com/f/rVd983F961GvDi971XD55j/2
    • @ElDj:列在子查询的where 子句中被反转。固定。
    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 2020-12-24
    • 2012-09-05
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多