2013-06-20 92 views
6

我有幾個記錄(票據),它們基本上彼此的副本,除了一個字段,它表示紙幣是在語言篩選重複行

,例如:

ID,BillID,Account,Name,Amount,Lang 
1,0001,abcd,John Smith,10.99,ENG 
2,0002,qwer,Jane Doe,9.99,ENG 
3,0001,abcd,John Smith,10.99,SPA 
4,0003,abcd,John Smith,4.99,CHI 

所有字段都是字符串,ID除外,它是自動編號。

在我的SQL選擇,我有

SELECT * 
FROM Bills 
WHERE Account='abcd' 

並返回總共3行,但兩行對同一議案。我需要爲特定帳戶返回唯一帳單。所以在上面的場景中,我想要檢索兩張billID 0003和SPA或ENG版本0001的賬單,但不是兩種。

查詢會是什麼?

謝謝

編輯:我不能依賴於特定的語言總是在那裏。例如,我不能說SELECT * FROM Bills WHERE Account='abcd' AND Lang='ENG',因爲有時賬單可能只有一種語言,而不是ENG,有時可能以幾種語言以任意組合。

+0

您想在什麼基礎上選擇要使用的語言?按字母順序?賬單ID - 最低還是最高?帳戶語言?還有別的嗎? –

+0

沒有特別優選。我需要得到一張處理賬單,而不是查看。當我們使用PDF格式呈現賬單時,語言只會起作用,但處理賬單時,語言無關緊要。 – George

回答

9

也許最簡單的方法是使用ROW_NUMBERPARTITION BY

SELECT * FROM (
    SELECT b.*, 
    ROW_NUMBER() OVER (PARTITION BY BillID ORDER BY Lang) as num 
    FROM Bills b 
    WHERE Account = 'abcd' 
) tbl 
WHERE num = 1 
+0

我最喜歡這個答案。我從來沒有見過這種方法。執行計劃表示來自Eric的查詢和user2407394的查詢成本相同。 – George

7
select 
ID,BillID,Account,Name,Amount,max(Lang) 
FROM Bills 
WHERE Account='abcd' 
group by BillID,Account,Name,Amount; 

鑑於如果多種語言中有相同的賬單,您並未優先考慮任何特定語言。上面的查詢將工作完美。

編輯:從組中刪除「ID」。 @菲爾你是對的..!

3
select 
BillID,Account,Name,Amount,max(Lang) 
FROM Bills 
WHERE Account='abcd' 
group by BillID,Account,Name,Amount; 

相同,只是沒有在GROUPBY的ID user2407394,因爲這將返回3了。

+0

我認爲這個(以及來自@ user2407394的答案)會給出錯誤,因爲如果沒有在「group by」中包含它,就不能選擇「ID」。 –

+0

@Eric你是對的。我修改了查詢以使用Max(ID),該Max(ID)可以工作,但由於MAX(ID)可能並不總是對應於MAX(Lang),所以出現了一些差異。在我的文章中,結果可能是'3,0001,abcd,John Smith,10.99,ENG'因爲3> 1和ENG> SPA(我不知道它,但你明白我的觀點)。 – George

+0

對不起,我的意思是把這個ID也拿出來。 – Phil