2017-07-10 12 views
2

ありがとうございました。 SQLデータのスナップショットが必要な状況がありますが、結果の一部は1つの列の集計に基づいている必要があります。ここに私のデータの小さなサブセットです:SQL - 特定の列の集計に部分的に基づく結果

| A | B | last_date | next_date | C | D | 
| 1 | 3 | 01/01/2000 | 01/01/2003 | 1 | 1 | 
| 1 | 3 | 01/01/2001 | 01/01/2004 | 1 | 2 | 
| 2 | 3 | 01/01/2002 | 01/01/2005 | 2 | 3 | 
| 2 | 4 | 01/01/2003 | 01/01/2006 | 3 | 4 | 

私の結果は、列AとB、LAST_DATEのMAXと次の日のMINによってグループ化する必要があります。しかし、キッカーは、列CとDの値は、次の日付のMINに対応する値でなければならないということです。したがって、上記のデータは、私の結果は次のようになりサブセットの:

| A | B | last_date | next_date | C | D | 
| 1 | 3 | 01/01/2001 | 01/01/2003 | 1 | 1 | 
| 2 | 3 | 01/01/2002 | 01/01/2005 | 2 | 3 | 
| 2 | 4 | 01/01/2003 | 01/01/2006 | 3 | 4 | 

注結果の最初の行は、初期データの2行目からLAST_DATEの値を有するが、列CおよびDの値がどのように対応しますか最初の行から最初のデータを削除します。列A、B、max(last_date)、min(next_date)は正確に重複していますが、列CとDの値が一致しない場合、どちらが返されるかは気にしません。私は倍数ではなく1つの行だけを返す必要があります。

+0

どのバージョンo f SQL Serverを使用していますか? –

+0

私は生産で12.0を使用していると信じています – cod1358

答えて

1

あなたはROW_NUMBERを使用することができますADNこれは以下のようになり得る:

Select top(1) with ties *, max(last_date) over(partition by A, B) as MaxLast_date, Min(next_date) over(partition by A, B) as MinNext_date 
    from #yourtable 
    Order by Row_number() over(partition by A, B order by next_date)  

出力:

+---+---+--------------+--------------+---+---+ 
| A | B | MaxLast_date | MinNext_date | C | D | 
+---+---+--------------+--------------+---+---+ 
| 1 | 3 | 2001-01-01 | 2003-01-01 | 1 | 1 | 
| 2 | 3 | 2002-01-01 | 2005-01-01 | 2 | 3 | 
| 2 | 4 | 2003-01-01 | 2006-01-01 | 3 | 4 | 
+---+---+--------------+--------------+---+---+ 

Select A, B, MaxLast_date, MinNext_date, C, D from (
    select *, max(last_date) over(partition by A, B) as MaxLast_date, Min(next_date) over(partition by A, B) as MinNext_date, 
     next_rn = Row_number() over(partition by A, B order by next_date) from #yourtable 
) a 
Where a.next_rn = 1 

他の方法は、以下のようにタイで(1)トップであります

Demo

関連する問題