SQL Server设置有重复记录

时间:2016-03-02 18:10:05

标签: sql sql-server duplicates unique recordset

我对如何向数据库发送查询有疑问,该数据库为我提供了一组记录,这些记录可能包含集合中一列中某个值的重复项,以及我需要它来提供整个集合的那些记录但只有每条重复记录中的一条记录。 DISTINCT对我来说效果不佳,因为整体记录可能不同。例如,当我要求结果集时,它提供以下内容:

╔═════════════════╦══════════════╦════════════╗
║ 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的重复记录,它只是给出了表格中显示的第一条记录。

我很感激你对这个的帮助,因为我不知道如何做到这一点。

谢谢!

1 个答案:

答案 0 :(得分: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不满意,可以使用临时表或子查询应用相同的逻辑。