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?

Kommentar zu dem Problem
Verwenden Sie Window-Funktionen (Oracle, so etwas wie row_number() over (partition by...), AFAIK SQL server hat eine ähnliche Funktionalität. Kommentarautor: Frank Schmitt

InformationsquelleAutor der Frage bleepzter | 2011-06-01

Schreibe einen Kommentar