2016-03-25 8 views
0

私は、イベントを含むイベントデータベースと、顧客がこれらのイベントのチケットを購入した注文を持っています。SQL Serverのぎこちないグループ

今後のイベントを持つ顧客のリストを返すクエリが必要で、次のイベントが何であるかを知る必要があります。

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 
すなわち来るべきイベントを持つすべての顧客のリスト

が、私はちょうどしたいのに対し、それはすべての彼らの今後のイベントを含む次の1例:

ので、いくつかは、参加した後、私はこのような出力を得ることができます

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

答えて

3

最も簡単な方法は、おそらくこのようなものです:

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) 

あなたはまた、代わりに派生テーブルのCTEを使用することができます。

;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

実際にSQLの多くはずっとあります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 
関連する問題