我有一些垃圾表需要从中提取数据。
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的组
这似乎有效,但这是一个需要在多个报告中部署的解决方案,所以我想知道是否有更紧凑的方法来做到这一点。
答案 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
的记录。