2017-02-28 12 views
0

に基づいて、私はカップルのテーブルを持っている:SQL Server 2008のSELECTのトップ3の異なる値のGROUP結果

表A.

id | Extra Columns | report ID 
---+---------------+---------- 
1 | datetime  | 1 
2 | datetime  | 3 
3 | datetime  | 4 
4 | datetime  | 1 
5 | datetime  | 1 
何私は思い

表B.

Report id | customer ID| 
----------+------------+ 
1  | Joe  | 
2  | Joe  | 
3  | Joe  | 
4  | Joe  | 
1  | Sally  | 
2  | Sally  | 
3  | Sally  | 

テーブルAのN個のエントリ(存在する場合)を選択すると、表Bで相互参照される顧客「Joe」に属する各レポートについて、出力は次のようになります。

id | datetime | report ID 
---+----------+---------- 
1 | datetime | 1 
4 | datetime | 1 
5 | datetime | 1 
2 | datetime | 3 
3 | datetime | 4 

他の多くのサポートテーブルがありますが、私はデータを取り込むために参加しますが、これらの2つは私に頭痛を与えています。表Aは膨大ですが、IDに対して索引を実行します。

答えて

0

ここでROW_NUMBER()を使用して、顧客Joeの一致レポートに番号を付けて、最初のN個のレポートを保持することができます。以下のクエリでは、この値を変更することはできますが、最初の3つは保持します。

SELECT t.id, t.[Extra Columns], t.[report ID] 
FROM 
(
    SELECT a.id, a.[Extra Columns], a.[report ID], 
      ROW_NUMBER() OVER (PARTITION BY b.[customer ID] ORDER BY b.[Report ID]) rn 
    FROM tableB b 
    INNER JOIN tableA a 
     ON b.[Report id] = a.[report ID] 
    WHERE b.[customer ID] = 'Joe' 
) t 
WHERE t.rn <= 3 
ORDER BY t.[report ID] 
+0

タイ、あなたは私に多くの時間を保存しました。私は実際には行番号の上ではなく、パーティション分割を試みました。 – snizkorod

+0

お世話になりました。 –

関連する問題