我的表格如下:
Id Timestamp name_id testobject_id
----------------------------------------------------
2 | 2017-12-15 18:36:46 | 1 | 1
3 | 2017-12-15 18:36:46 | 2 | 1
1 | 2016-01-01 00:00:00 | 1 | 1
4 | 2017-12-15 18:36:46 | 1 | 2
5 | 2017-12-15 18:36:46 | 2 | 2
我想要每个组的最后一条记录(name_id)。但我只想要testobject_id = 1的结果
但这似乎不起作用。我感谢你的每一个帮助。
SELECT *
FROM checkresult
WHERE timestamp IN (
SELECT MAX(timestamp)
FROM checkresult
WHERE test_object_id = 1
GROUP BY name_id
);
期望的输出:
Id Timestamp name_id testobject_id
----------------------------------------------------
2 | 2017-12-15 18:36:46 | 1 | 1
3 | 2017-12-15 18:36:46 | 2 | 1
我想你只想在最外层的查询中使用where
:
SELECT cr.*
FROM checkresult cr
WHERE cr.test_object_id = 1 AND
cr.timestamp = (SELECT MAX(cr2.timestamp)
FROM checkresult cr2
WHERE cr2.name_id = cr.name_id
);
请注意使用相关子查询的更改。这很重要,因为不同名称的行可以具有相同的时间戳值。一个名字的最新内容可能不是另一个名称的最新内容。
像这样的东西:
SELECT
Id
, Timestamp
, name_id
, test_object_id
FROM
(
SELECT
Id
, Timestamp
, name_id
, test_object_id
, ROW_NUMBER() OVER (PARTITION BY name_id ORDER BY Timestamp DESC) R
FROM checkresult
WHERE test_object_id = 1
) Q
WHERE R = 1
select c.*
from checkresult c
where c.timestamp = (
select max(timestamp) from checkresult where name_id = c.name_id
)
group by c.name_id
改为使用内连接:
SELECT *
FROM checkresult r
INNER JOIN (
SELECT name_id, MAX(timestamp)
FROM checkresult
WHERE test_object_id = 1
GROUP BY name_id
) g ON r. name_id = g.name_id
and r.timestamp = g.timestamp
WHERE r.test_object_id = 1