首页 > 解决方案 > 按最大日期分组并从每个分组记录中返回文本

问题描述

我正在尝试为每个人返回具有最大日期的行,我该如何过滤这个

  1. 缩写、日期、文本
  2. DD,2022 年 1 月 1 日,123
  3. DD,2021 年 1 月 1 日,456
  4. DD,2020 年 1 月 1 日,789
  5. 韩国时间,2020 年 1 月 1 日,美国广播公司
  6. 韩国时间,2022 年 1 月 1 日,高清
  7. 韩国时间,2021 年 1 月 2 日,吉

所以结果看起来像这样?

  1. 缩写、日期、文本
  2. DD,2022 年 1 月 1 日,123
  3. 韩国时间,2022 年 1 月 1 日,高清

我已经尝试了 MAX 日期并按首字母分组,但我试图从具有最大日期的条目中返回文本。

谢谢

标签: sql-server

解决方案


有几种方法可以做到这一点。

DDL(我使用临时表进行测试):

IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
    DROP TABLE #tmp;

CREATE TABLE #tmp (
    initials varchar(10),
    date date,
    text varchar(10)
);

INSERT INTO #tmp
VALUES
    ('DD', '2022-01-01', '123'),
    ('DD', '2021-01-01', '456'),
    ('DD', '2020-01-01', '789'),
    ('KT', '2020-01-01', 'abc'),
    ('KT', '2022-01-01', '123'),
    ('KT', '2021-01-02', 'ghi');

版本 1(带有 的子查询MAX):此版本提取唯一的首字母及其 MAX 日期,然后在这些首字母和日期上链接回原始表以从记录中提取文本。

SELECT t.initials, t.date, t.text
FROM #tmp AS t
INNER JOIN (
    SELECT initials, MAX(date) AS max_date
    FROM #tmp
    GROUP BY initials
) AS sub
    ON t.initials = sub.initials
    AND t.date = sub.max_date

版本 2(带有 的子查询ROW_NUMBER):此版本使用窗口函数 ROW_NUMBER 对按日期降序排列的每一行进行编号。这将使最近日期的行号为 1。然后从行号 = 1 的记录中提取文本。

SELECT sub.initials, sub.date, sub.text
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY initials ORDER BY date DESC) AS row_num
    FROM #tmp
) AS sub
WHERE sub.row_num = 1

由于最大日期样本集中两个首字母的文本相同,因此我在最终结果集中添加了首字母和日期以进行澄清。

您也可以使用 CTE 代替子查询,我更喜欢这样,但我不想让事情复杂化。


推荐阅读