根据优先级字段消除重复记录 - SQL

时间:2014-12-22 15:41:06

标签: sql sql-server tsql

早上好。我不认为我的脑袋在思考。我编写了工会以获得以下结果集,因为我认为这种方式可能更容易获得所需的最终值。在这里,我可以稍后对其进行优化。所以我有下面的结果集。它只能在Excel中使用,因此我可以进行屏幕截图。

表格示意图

A列= EmployeeID

B列= ActivityId

C列= PriorityNumber

D列= FSBillRate

E栏=分类

Result Set

无论如何..所以如果你诺丽丝(MD)有一个A列和B列的组合两次。

MD代码:1

MD代码:1

但是你注意到第一行的C列为1,第二行的C列为3.

我的目标:基于C列只有A和B列的1个组合。我想保留C列的较低位置。所以这种情况我想保留1.但是在BS代码的情况下: 1 4和BS代码:1 6我宁愿保持4,因为4比6低。

这必须在SELECT语句中完成,因为数据必须保留,这基本上是另一个查询的子查询。

1 个答案:

答案 0 :(得分:3)

试试这个: (根据评论编辑更新列名称)

使用Row_Number

的原始答案
with cte as (
  select [EmployeeID], [ActivityId], [Col3], [Col4], [Col5]
    , rownumber= row_number() over (
        partition by [EmployeeID], [ActivityId]
        order by [Col3]
        )
  from [table]

)
  select [EmployeeID], [ActivityId], [Col3], [Col4], [Col5]
    from cte
    where rownumber=1

使用Cross Apply

的替代解决方案
select t.[EmployeeID], t.[ActivityId], x.[Col3], x.[Col4], x.[Col5]
  from [table] t
    cross apply (
      select top 1 i.[Col3], i.[Col4], i.[Col5] 
        from [table] i 
        where i.[EmployeeID] = t.[EmployeeID]
          and i.[ActivityId] = t.[ActivityId]
        order by x.[Col3]
          ) as x
  group by t.[EmployeeID], t.[ActivityId], x.[Col3], x.[Col4], x.[Col5]