首页 > 解决方案 > SQL SERVER 如何选择每组中的最新记录?

问题描述

| ID | TimeStamp | Item |
|----|-----------|------|
| 1  | 0:00:20   | 0    |
| 1  | 0:00:40   | 1    |
| 1  | 0:01:00   | 1    |
| 2  | 0:01:20   | 1    |
| 2  | 0:01:40   | 0    |
| 2  | 0:02:00   | 1    |
| 3  | 0:02:20   | 1    |
| 3  | 0:02:40   | 1    |
| 3  | 0:03:00   | 0    |

我有这个,我想把它变成

| ID | TimeStamp | Item |
|----|-----------|------|
| 1  | 0:01:00   | 1    |
| 2  | 0:02:00   | 1    |
| 3  | 0:03:00   | 0    |

请指教,谢谢!

标签: sqlsql-servergroup-by

解决方案


您需要按 id 分组,并通过时间戳值降序过滤,以使所有记录在子查询中返回为第一个(值为 1)并具有分析函数的贡献:

SELECT *
  FROM
  (
   SELECT *,
          DENSE_RANK() OVER (PARTITION BY ID ORDER BY TimeStamp DESC) AS dr
     FROM t
  ) t
  WHERE t.dr = 1

其中DENSE_RANK()使用分析函数是为了也包括有关系的记录。


推荐阅读