SQL 有重复记录的服务器集
SQL Server Set with duplicate records
我对如何向数据库发送查询有疑问,该数据库为我提供了一组记录,这些记录可能仅在该组的一列中包含某个值的重复项,而我需要从这些记录中提供整个集合,但每个重复记录中只有一个记录。 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 的重复记录,它只给出了出现在 table 上的第一条记录。
非常感谢你在这方面的帮助,因为我不知道如何完成它。
谢谢!
使用 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
如果您不喜欢table CTE,您可以将相同的逻辑应用于临时table 或子查询。
我对如何向数据库发送查询有疑问,该数据库为我提供了一组记录,这些记录可能仅在该组的一列中包含某个值的重复项,而我需要从这些记录中提供整个集合,但每个重复记录中只有一个记录。 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 的重复记录,它只给出了出现在 table 上的第一条记录。
非常感谢你在这方面的帮助,因为我不知道如何完成它。
谢谢!
使用 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
如果您不喜欢table CTE,您可以将相同的逻辑应用于临时table 或子查询。