首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按最大日期分组,并从每个分组记录返回文本。

问按最大日期分组,并从每个分组记录返回文本。
EN

Stack Overflow用户
提问于 2021-10-27 14:40:50
回答 1查看 47关注 0票数 0

我试图返回每一个人的最大日期行,我如何过滤这个

  1. Initials,Date,Text
  2. DD,1/1/2022,123
  3. DD,1/1/2021,456
  4. DD,1/1/2020,789
  5. KT,1/1/2020,abc
  6. KT,1/1/2022,def

H 115KT,1/2/2021,ghiH 216G 217

结果是这样的吗?

  1. Initials,Date,Text
  2. DD,1/1/2022,123
  3. KT,1/1/2022,def

我已经尝试了最大日期和分组的首字母,但我试图返回文本从条目的最大日期。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-27 19:58:13

做这件事有几种方法。

DDL (我为测试目的使用了临时表):

代码语言:javascript
复制
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的子查询):该版本提取唯一的首字母及其最大日期,然后链接到这些首字母上的原始表和日期,以便从记录中提取文本。

代码语言:javascript
复制
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从记录中提取文本。

代码语言:javascript
复制
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而不是子查询(我更喜欢这样),但我不想让事情复杂化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69740732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档