从带有重复项的非规范化表中选择活动角色

时间:2015-03-11 21:36:11

标签: sql sql-server tsql

我有一些垃圾表需要从中提取数据。

 Name        | Person# | Assignment_Status | Group
 --------------------------------------------------
 Smith, John | 1234567 | NLE               | G1
 Smith, John | 1234567 | Active            | G2
 Jones, Jane | 7654321 | Active            | G1
 James, Jack | 9876541 | LOA               | G3
 Peep, Laura | 6549871 | ServiceLOA        | G1
 Some, One   | 3219875 | NLE               | G2

每当一个人移动组时,他们当前的assignment_status被设置为NLE,并且创建新记录以将assignment_status设置为Active为新组。当一个人离开公司时,他们还将assignment_status设置为NLE。此表没有唯一的行ID,也没有日期戳。

我需要一个查询,将每个员工的表减少到1个记录,如果员工有多个记录,我需要不是NLE的Assignment_Status。例如,John Smith应该显示为G2的活动。

我的第一次尝试是:

 SELECT *
 INTO #TempAssignments
 FROM
    (SELECT 
       ROW_NUMBER() OVER (ORDER BY aID) AS ID,
       Name,
       Person#,
       (CASE WHEN Assignment_Status='NLE' THEN 1 ELSE 0 END) AS aID,
       Group
     FROM
       tblAssignments)

使用临时表中的数据然后我创建了第二个查询以选择ID的MIN,aID的MIN和GROUP BY名称以及Person#然后将其连接回临时表以获取给定ID的组

这似乎有效,但这是一个需要在多个报告中部署的解决方案,所以我想知道是否有更紧凑的方法来做到这一点。

1 个答案:

答案 0 :(得分:1)

以下查询:

SELECT Name, Person#, [Group]
FROM (
  SELECT Name, Person#, [Group],
         ROW_NUMBER() OVER (PARTITION BY Person#, Name 
                            ORDER BY CASE 
                                      WHEN Assignment_Status <> 'NLE' THEN 0 
                                      ELSE 1 
                                     END) AS rn
   FROM tblAssignments ) t
WHERE t.rn = 1

将为每位员工选择一条记录,由Person#, Name值对标识。如果员工有多条记录,则会选择Assignment_Status不是NLE的记录。