2016-03-02 75 views
-1

我對如何向數據庫發送查詢有疑問,該數據庫給了我一組記錄,這些記錄可能包含某個值的重複值,並且來自那些需要的記錄它會給出整個集合,但每個重複記錄只有一條記錄。 DISTINCT對我來說效果不好,因爲整體記錄可能不同。例如,當我問結果集它提供了以下:SQL Server Set with duplicate records

╔═════════════════╦══════════════╦════════════╗ 
║ ContratctNumber ║ BusinessType ║ PersonType ║ 
╠═════════════════╬══════════════╬════════════╣ 
║   12345 ║   1 ║   1 ║ 
║   23455 ║   3 ║   1 ║ 
║   275479 ║   1 ║   2 ║ 
║   275479 ║   2 ║   1 ║ 
║   275479 ║   3 ║   2 ║ 
║   234576 ║   2 ║   1 ║ 
║   78656 ║   1 ║   1 ║ 
║   5678 ║   3 ║   1 ║ 
║   5678 ║   2 ║   1 ║ 
╚═════════════════╩══════════════╩════════════╝ 

而我需要的結果是這樣的:

╔═════════════════╦══════════════╦════════════╗ 
║ ContratctNumber ║ BusinessType ║ PersonType ║ 
╠═════════════════╬══════════════╬════════════╣ 
║   12345 ║   1 ║   1 ║ 
║   23455 ║   3 ║   1 ║ 
║   275479 ║   1 ║   2 ║ 
║   234576 ║   2 ║   1 ║ 
║   78656 ║   1 ║   1 ║ 
║   5678 ║   3 ║   1 ║ 
╚═════════════════╩══════════════╩════════════╝ 

正如你看到它給了我所有的設置,但對於具有相同ContractNumber的重複記錄,它只是給出表中出現的第一條記錄。

我會很感激你對這一個幫助,因爲我不知道如何做到這一點。

謝謝!

+0

如何在表中定義* first *?你有可以使用的日期欄嗎? – GarethD

+0

[在sql查詢中刪除所有可用列中只有一個列值的重複值]的可能重複(http://stackoverflow.com/questions/28694871/remove-duplicate-values-of-only-one-column-value - 從 - 所有的可用柱) –

回答

0

使用row_number與定製的順序。該查詢將在partition子句中每個唯一標識符組合返回一行。當存在多行時,它將選擇最低的BusinessType。

; with CTE as (
    select * 
    , row_number() over (partition by ContractNumber, Person Type 
         order by BusinessType) as RN 
    from MyTable) 

Select * from CTE where RN = 1 

如果您不熟悉CTE,則可以使用與臨時表或子查詢相同的邏輯代替。