2017-02-28 47 views
0

我有一對夫婦一組表結果:SQL Server 2008中選擇頂層3不同的值

表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 

值得注意的是,還有很多其他的支持表,我將加入拉數據,但這兩個讓我很頭疼。表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

很高興幫助你。 –