SQL中基于ID按日期小时去重,需保留CheckTime的datetime格式
问题描述
现有SQL语句
SELECT ,[ID] ,[Name] ,[Age] ,[CheckTime] FROM Record
当前数据
| ID | 姓名 | 年龄 | 检查时间 |
|---|---|---|---|
| 12 | Alex | 23 | 2022-08-16 06:16:46.000 |
| 13 | Cynthia | 45 | 2022-08-16 06:16:53.000 |
| 14 | Kwabeng | 57 | 2022-08-16 07:54:44.000 |
| 14 | Kwabeng | 57 | 2022-08-16 07:54:51.000 |
| 15 | Asante | 23 | 2022-08-16 07:54:32.000 |
| 16 | Leticia | 98 | 2022-08-16 07:58:32.000 |
| 16 | Leticia | 98 | 2022-08-16 07:45:49.000 |
| 12 | Mercy | 23 | 2022-08-16 07:42:36.000 |
当前表中,ID为14、16的记录仅CheckTime不同,需去除其中一条重复记录,同时保留CheckTime的datetime格式(不能转为字符串,否则无法后续按日期筛选)。
期望数据
| ID | 姓名 | 年龄 | 检查时间 |
|---|---|---|---|
| 12 | Alex | 23 | 2022-08-16 06:16:46.000 |
| 13 | Cynthia | 45 | 2022-08-16 06:16:53.000 |
| 14 | Kwabeng | 57 | 2022-08-16 07:54:44.000 |
| 15 | Asante | 23 | 2022-08-16 07:54:32.000 |
| 16 | Leticia | 98 | 2022-08-16 07:58:32.000 |
| 12 | Mercy | 23 | 2022-08-16 07:42:36.000 |
遇到的问题
曾尝试用以下SQL去重,但该语句将CheckTime转为字符串类型,导致后续无法按日期筛选:
SELECT ID, Name, Age, FORMAT(CheckTime, 'yyyy-MM-dd:HH') AS [DateHour] , COUNT(Name) AS [Age] FROM Record GROUP BY ID,Name, Age, FORMAT(CheckTime, 'yyyy-MM-dd:HH'),
解决方案
可以使用窗口函数ROW_NUMBER()实现分组去重,同时完整保留CheckTime的datetime类型。核心逻辑是按ID+Name+Age分组,给每组内的记录按CheckTime排序,只保留排序后序号为1的记录。
方法1:保留每组中最早的CheckTime
WITH RankedRecords AS ( SELECT ID, Name, Age, CheckTime, -- 按ID+姓名+年龄分组,组内按检查时间升序排序,最早的记录序号为1 ROW_NUMBER() OVER (PARTITION BY ID, Name, Age ORDER BY CheckTime ASC) AS rn FROM Record ) SELECT ID, Name, Age, CheckTime FROM RankedRecords WHERE rn = 1;
方法2:保留每组中最晚的CheckTime
如果需要保留最新的检查时间,只需将排序方式改为降序:
WITH RankedRecords AS ( SELECT ID, Name, Age, CheckTime, -- 按ID+姓名+年龄分组,组内按检查时间降序排序,最晚的记录序号为1 ROW_NUMBER() OVER (PARTITION BY ID, Name, Age ORDER BY CheckTime DESC) AS rn FROM Record ) SELECT ID, Name, Age, CheckTime FROM RankedRecords WHERE rn = 1;
说明
PARTITION BY ID, Name, Age:明确分组依据,确保只有当ID、姓名、年龄完全相同时才判定为重复组(比如ID=12的两条记录因姓名不同,不属于重复)。ROW_NUMBER()会给每组内的记录分配唯一序号,筛选rn=1即可得到每组的单条记录。- 该方案完全保留
CheckTime的datetime类型,后续可正常执行日期范围筛选等操作。
内容的提问来源于stack exchange,提问作者Immanuel
相关产品推荐
相关产品推荐

