13

Ich verwende diesen Code ein: (von dieser Frage: How to get the last record per group in SQL meine eigenen Spalten ersetzen)Kann ROW_NUMBER() OVER/PARTITION BY nur verwendet werden, wenn auch eine andere Spalte gleich ist?

WITH e AS 
(
SELECT *, 
    ROW_NUMBER() OVER 
    (
     PARTITION BY ApplicationId 
     ORDER BY theDate DESC 
    ) AS Recency 
FROM [Event] 
) 
SELECT * 
FROM e 
WHERE Recency = 1 

Ist es möglich, nur auf ‚Partition‘, wenn zwei Felder gleich sind? Zum Beispiel habe ich Daten wie folgt aus:

ID  Name theDate 
123  John 01/01/2012 
123  John 01/02/2012 
123  Doe  01/01/2012 
456  Smith 02/04/2012 
789  Smith 02/01/2012 
789  Smith 02/09/2012 
789  Roger 02/08/2012 

Aus diesen Daten zurückkehren Ich möchte würde:

ID  Name theDate 
123  John 01/02/2012 
123  Doe  01/01/2012 
456  Smith 02/04/2012 
789  Smith 02/09/2012 
789  Roger 02/08/2012 

Vielen Dank für jede Hilfe.

Thomas

+0

Identische Antwort so auf die älteste –

+0

Dies muss Hausaufgaben sein. – JeffO

+0

@ JeffO Nein ... Ich versuche nur nicht, Kundendaten einzufügen, wenn ich es helfen kann. – tsdexter

Antwort

4

ich es gefunden habe, die Antwort hier getrennt haben: Table partitioning using 2 columns

können Sie nur Partition auf 1 Spalte, aber die Spalte kann erzeugt werden, um eine "Mehrfachpartition" wie folgt zu erzeugen:

Wenn Sie die beiden Spalten als eine einzige Zeichenfolge zusammenfügen, wird sichergestellt, dass sie nur dann partitioniert, wenn beide Spalten identisch sind.

+2

Ich glaube, Sie verwirren Tabellpartitionierung mit "PARTITION BY" - während sie ähnlich benannt sind, sind sie in keiner Weise verwandt. Sie sind sicherlich nicht auf eine Spalte oder einen Ausdruck in 'PARTITION BY' beschränkt und es besteht keine Notwendigkeit für Ihre so genannte 'Mehrfachpartition' ... –

+0

@AaronBertrand ja Ich weiß, dass der Link, den ich gepostet habe, über die Tabellenpartitionierung ist. m mit PARTITION BY aber was der Typ, der diese Frage beantwortet hat, gilt auch hier. Der obige Vorschlag (field1, field2) funktioniert nicht, um die Daten zurückzugeben, wie ich es brauche, während der Code, den ich lieferte, die Antwort in der Verbindung liefert (Field1 + '' + Field2) stellt die korrekten Daten zur Verfügung ... das ist nicht der richtige Weg, es zu tun? – tsdexter

+0

@AaronBertrand Ich habe die Ergebnisse nicht vollständig getestet, aber ich denke, PARTITION BY Feld1, Feld2 erste Partition auf dem ersten Feld und dann weitere Partitionen, die sich auf das zweite Feld ergeben, ist das richtig? Das ist nicht was ich brauche. – tsdexter

30

Sie können mehrere Spalten durch ein Komma

WITH e AS 
( 
SELECT *, 
    ROW_NUMBER() OVER 
    ( 
     PARTITION BY ApplicationId , Name 
     ORDER BY theDate DESC 
    ) AS Recency 
FROM [Event] 
) 
SELECT * 
FROM e 
WHERE Recency = 1 
+0

Haben Sie das versucht? In der Dokumentation von Over (http://msdn.microsoft.com/en-us/library/ms189461.aspx) ist nicht klar, wie viele Spalten Sie angeben können. – 000

+0

Dies funktioniert nicht wie vorgesehen. Es teilt immer noch ALLE mit der gleichen ID auf und dann nehme ich weitere Partitionen an, die auf der zweiten Spalte basieren. Siehe meine Antwort, die ich hinzugefügt habe. – tsdexter

+2

+1. Dies funktioniert genau wie beabsichtigt und liefert die genaue Antwort, die Sie in der Frage gefragt haben. Wenn nicht, müssen Sie erklären, wie. Ich vermute, Sie haben es nicht wirklich getestet, weil Ihre Beschreibung, wie es nicht funktioniert hat, nicht mit dem übereinstimmt, was es tatsächlich tut. –

Verwandte Themen