【问题标题】:Latest entry in a group SQL Server组 SQL Server 中的最新条目
【发布时间】:2020-03-28 17:14:41
【问题描述】:

鉴于下面的示例数据,我需要一个最新条目被拒绝的 id 列表。因此,我需要查看 id 2,因为它的最新版本是 2020 年 6 月 4 日,并且被拒绝。我不想看到 id 1,因为它的最新条目是 Requested。

CREATE TABLE #temp
(
    id int, 
    mydate datetime,
    status VARCHAR(20)
)

INSERT INTO #temp VALUES (1, '6/1/2020', 'Rejected')
INSERT INTO #temp VALUES (1, '6/2/2020', 'Requested')
INSERT INTO #temp VALUES (1, '6/3/2020', 'Rejected')
INSERT INTO #temp VALUES (1, '6/4/2020', 'Requested')

INSERT INTO #temp VALUES (2, '6/1/2020', 'Requested')
INSERT INTO #temp VALUES (2, '6/2/2020', 'Requested')
INSERT INTO #temp VALUES (2, '6/3/2020', 'Requested')
INSERT INTO #temp VALUES (2, '6/4/2020', 'Rejected')

SELECT * FROM #temp

SELECT id, MAX(mydate)
FROM #temp
WHERE status = 'Rejected'
GROUP BY id

到目前为止,这是我可怜的尝试

SELECT id, MAX(mydate)
FROM #temp
WHERE status = 'Rejected'
GROUP BY id

但这只会带回每个组中的最新日期。我需要一个最新条目被拒绝的列表。我希望答案会简单得令人尴尬,但我对此很感兴趣。

谢谢

卡尔

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    您可以使用row_number() 函数获取此信息,如下所示。

    ;WITH cte
    AS (
        SELECT Id
            ,mydate
            ,STATUS
            ,ROW_NUMBER() OVER (
                PARTITION BY Id, status ORDER BY mydate desc
                ) row_num
        FROM #temp
        )
    SELECT *
    FROM cte
    WHERE row_num = 1
        AND STATUS = 'Rejected'
    

    这是现场db<>fiddle 演示。

    【讨论】:

      【解决方案2】:

      一种方法使用聚合和having

      select id
      from #temp
      group by id
      having max(case when status = 'Rejected' then mydate end) = max(mydate);
      

      这几乎是您问题的直接翻译:'Rejected' 的最新日期是给定id 的最新日期。

      更传统的方法使用相关子查询:

      select t.*
      from #temp t
      where t.mydate = (select max(t2.mydate)
                        from #temp t2
                        where t2.id = t.id
                       ) and
            t.status = 'Rejected';
      

      或窗口函数:

      select t.*
      from (select t.*,
                   row_number() over (partition by id order by mydate desc) as seqnum
            from #temp t
           ) t
      where t.seqnum = 1 and t.status = 'Rejected';
      

      【讨论】:

        猜你喜欢
        • 2011-09-21
        • 2022-06-13
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多