SQL SERVER如何选择每个组中的最新记录?

时间:2020-03-24 13:40:23

标签: sql sql-server group-by

| 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    |

请告知,谢谢!

2 个答案:

答案 0 :(得分:1)

相关子查询通常是最快的方法:

select t.*
from t
where t.timestamp = (select max(t2.timestamp)
                     from t t2
                     where t2.id = t.id
                    );

为此,您需要在(id, timestamp)上建立索引。

您也可以使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by id order by timestamp desc) as seqnum
      from t
     ) t
where seqnum = 1;

这通常慢一点,因为它需要为每行分配行号,即使没有返回的行也是如此。

答案 1 :(得分:1)

您需要按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()分析功能以便还包括具有联系的记录。

相关问题