Wie bekomme ich den letzten Datensatz pro Gruppe in SQL?
Stehe ich vor einem sehr interessanten problem. Ich habe eine Tabelle mit der folgenden Struktur:
CREATE TABLE [dbo].[Event]
(
Id int IDENTITY(1,1) NOT NULL,
ApplicationId nvarchar(32) NOT NULL,
Name nvarchar(128) NOT NULL,
Description nvarchar(256) NULL,
Date nvarchar(16) NOT NULL,
Time nvarchar(16) NOT NULL,
EventType nvarchar(16) NOT NULL,
CONSTRAINT Event_PK PRIMARY KEY CLUSTERED ( Id ) WITH (
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
)
)
Also das Problem ist, dass ich die Anzeige dieser Daten in einem raster. Es gibt zwei Anforderungen. Die erste ist, um alle Ereignisse anzuzeigen, unabhängig davon, welche Anwendung, warf Sie. Das ist einfach eine select-Anweisung wird die Arbeit sehr leicht.
Die zweite Voraussetzung ist die Fähigkeit zum gruppieren von Ereignissen nach Application
. In anderen Worten, alle Ereignisse anzuzeigen, die in einer Weise, dass, wenn die ApplicationId
wiederholt mehr als einmal, nehmen Sie nur den letzten Eintrag für jede Anwendung. Der Primärschlüssel der Veranstaltung (Id) an dieser Stelle ist nicht mehr erforderlich, in diesem query/view.
Möglicherweise bemerken Sie auch, dass das Event-Datum und Uhrzeit im string-format. Das ist ok, denn Sie befolgen das standard-Datum-Zeit-Formate: - mm/dd/yyyy und hh:mm:ss. Kann ich ziehen diese wie folgt:
Convert( DateTime, (Date + ' ' + Time)) AS 'TimeStamp'
Mein Problem ist, dass wenn ich die AGGREGATFUNKTIONEN verwenden auf den rest der Spalten weiß ich nicht, wie würden Sie sich Verhalten:
SELECT
ApplicationId,
MAX(Name),
MAX(Description),
MAX( CONVERT(DateTime, (Date + ' ' + Time))) AS 'TimeStamp',
MAX( EventType )
FROM
Event
GROUP BY
ApplicationId
Dem Grund bin ich zögerlich, dies zu tun ist, da eine Funktion wie MAX
zurückkehren wird der größte Wert für eine bestimmte Spalte aus einer (sub)Gruppe von Datensätzen. Es ist nicht notwendig, ziehen Sie den letzten Datensatz!
Irgendwelche Ideen auf, wie Sie nur der Letzte Datensatz auf einer pro Anwendung Grundlage?
InformationsquelleAutor der Frage bleepzter | 2011-06-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie eine ranking Funktion und ein common table expression.
InformationsquelleAutor der Antwort Anthony Faull
Seit SQL Server 2012 können Sie einfach
InformationsquelleAutor der Antwort tartakynov
InformationsquelleAutor der Antwort manji
Können Sie eine subqery oder CTE-Tabelle, um dies zu tun:
InformationsquelleAutor der Antwort Jon Egerton
Weil Sie nicht über eine where-Klausel, die Teilmenge der Datensätze, alle Datensätze. Aber Sie setzen sich mit max auf der falschen Spalte(s) denke ich. Diese Abfrage erhalten Sie, was Sie suchen.
InformationsquelleAutor der Antwort Jody
Können Sie eine sub-Abfrage mit group by die group by-argument muss nicht in der select. Dies setzt Voraus, Id wird automatisch hochgezählt, so dass die größte ist die jüngste.
InformationsquelleAutor der Antwort cordsen
Ich denke, dass es viele gibt, die bereit sind, zu Holen die letzten eingefügten Datensatz, und es sollte group by:
select * from (select * from TableName ORDER BY id DESC) AS x GROUP BY Feldname
Es funktioniert für die folgenden:
Tabelle Struktur
ID Name Status
1 Junaid Ja
2 Jawad Keine
3 Fahad Ja
4 Junaid Keine
5 Kashif Ja
Ergebnisse Nach Der Abfrage Oben
ID Name Status
4 Junaid Keine
2 Jawad Keine
3 Fahad Ja
4 Kashif Ja
Es ist einfach resultierenden den letzten Datensatz der Gruppe, die Namen.
InformationsquelleAutor der Antwort smjunaidiqbal
Nach 6 Jahren eine andere Antwort für SQL Server:
Obwohl ich wie Postgresql Lösung viel besser mit den verschiedenen on-Funktion, die ist schöner zu geben und viel effizienter:
InformationsquelleAutor der Antwort Domagoj Peharda