sql-server - 按最大日期分组并从每个分组记录中返回文本
问题描述
我正在尝试为每个人返回具有最大日期的行,我该如何过滤这个
- 缩写、日期、文本
- DD,2022 年 1 月 1 日,123
- DD,2021 年 1 月 1 日,456
- DD,2020 年 1 月 1 日,789
- 韩国时间,2020 年 1 月 1 日,美国广播公司
- 韩国时间,2022 年 1 月 1 日,高清
- 韩国时间,2021 年 1 月 2 日,吉
所以结果看起来像这样?
- 缩写、日期、文本
- DD,2022 年 1 月 1 日,123
- 韩国时间,2022 年 1 月 1 日,高清
我已经尝试了 MAX 日期并按首字母分组,但我试图从具有最大日期的条目中返回文本。
谢谢
解决方案
有几种方法可以做到这一点。
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 代替子查询,我更喜欢这样,但我不想让事情复杂化。
推荐阅读
- wordpress - 从正文中删除类名“页面”
- typescript - 你能在 React Navigation Tab Navigator 中以编程方式生成屏幕吗
- javascript - 为什么汇总无法解析 .d.ts 文件?
- list - 如何在颤振飞镖中使用相同元素初始化列表?
- image - ffmpeg提取无损png帧
- c# - 从另一个类使用的表单事件
- mysql - 无法打开与数据库的连接;MySQL.Data.MySQLClient; 无法为选定对象创建设计窗口
- django - 如何使用不同 PostgreSQL 模式中的表创建具有多对多关系的 Django 模型,一个模型仅使用非托管表的一部分
- javascript - 如何使用 JavaScript / jQuery 选择/取消选择带有复选框的选择选项?
- android - 为什么我的应用程序要求启用未知来源,即使它已发布到 Play Store 并从 Playstore 安装