2016-03-25 6 views
0

Ich habe eine Ereignisdatenbank, die Ereignisse und Aufträge enthält, die Kunden getätigt haben, um Tickets für diese Ereignisse zu kaufen.Unbeholfene Gruppe mit SQL Server

Ich brauche eine Abfrage, die eine Liste der Kunden, die ein bevorstehendes Ereignis haben, und um zu wissen, was das nächste Ereignis, das sie wird, ist.

So nach ein paar verbindet ich diese Art der Ausgabe bekommen:

CustomerNo | PerformanceDate | EventName 
1234  | 2016-07-01 19:00 | Phantom of the Opera 
2345  | 2016-06-01 19:00 | The sound of music 
1234  | 2016-06-01 19:00 | The sound of music 

das heißt, eine Liste aller Kunden mit einem bevorstehenden Ereignis, aber es enthält alle kommenden Ereignisse während ich will nur das nächste Beispiel

CustomerNo | PerformanceDate | EventName 
2345  | 2016-06-01 19:00 | The sound of music 
1234  | 2016-06-01 19:00 | The sound of music 

Antwort

3

Der einfachste Weg ist wahrscheinlich so etwas wie folgt aus:

SELECT t.CustomerNo, PerformanceDate, EventName 
FROM TableName t 
INNER JOIN (
    SELECT CustomerNo, Min(PerformanceDate) As MinDate 
    FROM TableName 
    GROUP BY CustomerNo 
) g ON(t.CustomerNo = g.CustomerNo AND t.PerformanceDate = g.MinDate) 

Sie auch einen CTE anstelle der abgeleiteten Tabelle verwenden können:

;With cte as 
(
    SELECT CustomerNo, Min(PerformanceDate) As MinDate 
    FROM TableName 
    GROUP BY CustomerNo 
) 

SELECT t.CustomerNo, PerformanceDate, EventName 
FROM TableName t 
INNER JOIN cte ON(t.CustomerNo = cte.CustomerNo AND t.PerformanceDate = cte.MinDate) 
2

In der Tat eine Menge von SQL viel einfacher in SQL Server :)

SELECT * 
FROM 
(
    SELECT *, 
     ROW_NUMBER() 
     OVER (PARTITION BY CustomerNo 
      ORDER BY PerformanceDate) AS rn 
    FROM TableName 
    WHERE PerformanceDate > NOW() 
) AS dt 
WHERE rn = 1