| 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 |
请告知,谢谢!
答案 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()
分析功能以便还包括具有联系的记录。