SQL获取组的最后记录

问题描述 投票:0回答:4

我的表格如下:

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
sql
4个回答
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
                     );

请注意使用相关子查询的更改。这很重要,因为不同名称的行可以具有相同的时间戳值。一个名字的最新内容可能不是另一个名称的最新内容。


0
投票

像这样的东西:

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

0
投票
select c.*
from checkresult c
where c.timestamp = (
       select max(timestamp) from checkresult where name_id = c.name_id
   )
group by c.name_id

0
投票

改为使用内连接:

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
© www.soinside.com 2019 - 2024. All rights reserved.