2016-08-21 6 views
0

Ich habe eine Tabelle wie folgt:Auswahl bestimmter Werte aus der Datenbank

ParentActivityID | AktivitätsID | Zeitstempel

1    A1   T1 
2    A2   T2 
1    A1   T1 
1    A1   T5 

Ich möchte eindeutige ParentActivityIDs zusammen mit Timestamp auswählen. Der Zeitstempel kann der jüngste sein oder der erste, wie er in der Tabelle vorkommt.

Ich habe versucht, DISTINCT zu verwenden, aber ich erkannte, dass es nicht an einzelnen Spalten arbeitet. Ich bin neu in SQL. Jede Hilfe in dieser Hinsicht wird sehr geschätzt.

Antwort

0

DISTINCT ist eine Kurzschrift, die für eine einzelne Spalte funktioniert. Wenn Sie mehrere Spalten haben, verwenden Sie GROUP BY:

SELECT ParentActivityID, Timestamp 
FROM MyTable 
GROUP BY ParentActivityID, Timestamp 

Eigentlich möchte ich eine einzige ParentActivityID. Ihre Lösung gibt jedes Paar von ParentActivityID und Timestamp. Zum Beispiel wollte ich, wenn ich [1, T1], [2, T2], [1, T3] habe, den Wert als [1, T3] und [2, T2].

Sie müssen entscheiden, welche der vielen Zeitstempel auszuwählen sind. Wenn Sie die früheste möchten, verwenden Sie MIN:

SELECT ParentActivityID, MIN(Timestamp) 
FROM MyTable 
GROUP BY ParentActivityID 
+0

Danke für die Antwort. Eigentlich möchte ich nur eine einzige ParentActivityID. Ihre Lösung gibt jedes Paar von ParentActivityID und Timestamp. Für e.g, wenn ich [1, T1], [2, T2], [1, T3] habe, dann wollte ich den Wert als [1, T3] und [2, T2]. – Varun

0

„Gruppe von“ ist das, was Sie hier benötigen. Just do „Gruppe von ParentActivityID“ und sagt, dass die jüngsten Zeitstempeln entlang alle Zeilen mit dem gleichen ParentActivityID ist für Sie benötigen:

SELECT ParentActivityID, MAX(Timestamp) FROM Table GROUP BY ParentActivityID 

„Gruppe von“ Operator ist wie Zeilen aus einer Tabelle zu nehmen und sie in einer Karte setzen mit ein Schlüssel, der in der Klausel group by definiert ist (ParentActivityID in diesem Beispiel). Sie müssen definieren, wie die Gruppierung nach Zeilen mit doppelten Schlüsseln behandelt. Dafür haben Sie verschiedene Aggregatfunktionen, die Sie für die Spalten angeben, die Sie auswählen möchten, die aber nicht Teil des Schlüssels sind (nicht in der Gruppenklausel aufgeführt, denken Sie an sie als Werte in einer Map).

Einige Datenbanken (wie mysql) erlauben Ihnen auch, Spalten auszuwählen, die nicht Teil der group by-Klausel sind (nicht in einem Schlüssel), ohne eine Aggregatfunktion auf sie anzuwenden. In diesem Fall erhalten Sie einen zufälligen Wert für diese Spalte (das ist, als würde man den Wert in einer Karte mit jedem neuen Wert blind überschreiben). Dennoch, SQL-Standard zusammen mit den meisten Datenbanken da draußen wird Ihnen nicht erlauben, es zu tun. In diesem Fall können Sie min(), max(), first() oder last() Aggregatfunktion verwenden, um es zu umgehen.

0

Try this:

SELECT [ParentActivityId], 
     MIN([Timestamp]) AS [FirstTimestamp], 
     MAX([Timestamp]) AS [RecentTimestamp] 
FROM [Table] 
GROUP BY [ParentActivityId] 

Diese stellen Sie die ersten Zeitstempel und die letzte Zeitmarke für jede ParentActivityId, die in der Tabelle vorhanden ist. Sie können die, die Sie benötigen, nach Ihren Bedürfnissen auswählen.

0

Verwenden Sie CTE zum Abrufen der neuesten Zeile aus Ihrer Tabelle basierend auf der übergeordneten ID, und Sie können die Spalten aus der gesamten Zeile der Ausgabe auswählen.

;With cte_parent 
As 
    (SELECT ParentActivityId,ActivityId,TimeStamp 
      , ROW_NUMBER() OVER(PARTITION BY ParentActivityId ORDER BY TimeStamp desc) RNO 
    FROM YourTable) 

SELECT * 
FROM cte_parent 
WHERE RNO =1 
Verwandte Themen