2017-12-15 2 views
0

meinem Tisch ist die folgende:SQL letzten Datensatz der Gruppe bekommen, wo

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 

Ich möchte den letzten Datensatz jeder Gruppe (name_id). Aber ich will nur die Ergebnisse wo testobject_id = 1

Aber das scheint nicht zu funktionieren. Ich bin dankbar für jede Hilfe.

SELECT * 
    FROM checkresult 
    WHERE timestamp IN (
     SELECT MAX(timestamp) 
     FROM checkresult 
     WHERE test_object_id = 1  
     GROUP BY name_id 
    ); 

gewünschte Ausgabe:

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

und das DBMS verwenden Sie? –

Antwort

1

Ich glaube, Sie die where in der äußersten Abfrage nur wollen:

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

Hinweis die Änderung zur Verwendung eines corr elated Unterabfrage. Dies ist wichtig, da Zeilen für verschiedene Namen denselben Zeitstempelwert haben können. Was für einen Namen das Neueste ist, ist möglicherweise nicht das Neueste für einen anderen.

0

Verwenden Sie eine innere Verknüpfung statt:

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

@ RadimBača danke, ja, & ich bevorzuge die innere Verbindung über eine Korrelation –

0

Etwas wie folgt aus:

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