我正在解决一个问题,即员工每周获得一定的分数。他们每周只有1分,每个星期六都会保存一次。我想计算连续的周数(从今天开始倒退),它们超过50。如果前一周不超过50,那么它们将连续0周。如果在过去一年中他们每周的得分都超过50,那么他们将连续52周。
我尝试使用Row_Number()函数来获取此信息,但无法弄清楚如何将分数作为其中的一个因素。
这是数据集的示例:
EmpID Last Week Score
A 7/6/2019 60
A 6/29/2019 84
A 6/22/2019 21
B 7/6/2019 41
B 6/29/2019 92
C 7/6/2019 77
C 6/29/2019 55
C 6/22/2019 71
C 6/15/2019 63
这是我到目前为止尝试过的
SELECT
EmpID,
EOW,
SCORE,
ROW_NUMBER() OVER(PARTITION BY EMP ORDER BY EOW DESC) AS RN
FROM a
ORDER BY EmpID, EOW DESC
但这只给了我每位员工的行数。当他们的分数低于50时,我需要停止计数:
EmpID Last Week Score RN
A 7/6/2019 60 1
A 6/29/2019 84 2
A 6/22/2019 21 -
B 7/6/2019 41 -
B 6/29/2019 92 -
C 7/6/2019 77 1
C 6/29/2019 55 2
C 6/22/2019 71 3
C 6/15/2019 63 4
然后,我需要为每个员工获取连续几个星期的单个数字,以便我可以将结果加入到更大的查询中,以获取有关该员工的其他信息。分数在不同的表中,这就是为什么我必须加入它的原因。查询应产生如下结果:
EmpID Last Week Consecutive Week
A 7/6/2019 2
B 7/6/2019 0
C 7/6/2019 4
这有意义吗?任何帮助将不胜感激
答案 0 :(得分:0)
我使用条件聚合和运行总计。
基本思想是:
如果数字> = 50,则派生列的总和为0。
连续的零将在第一个<50值处停止。
然后计算零的数量。
我添加了特殊情况[D组]:
('D','7/6/2019' , 51 )
('D','6/29/2019' , 49)
('D','6/22/2019' ,52 )
在这种情况下将只有一个零。
如果只有一个零,我认为连续几周应该是零而不是1。
我将[D组]添加到了测试样本中。
尝试一下:
SELECT B.EmpID,B.[Last Week], CASE WHEN B.TOTAL <= 1 THEN 0 ELSE B.TOTAL END AS RN
FROM (
SELECT A.EmpID, MAX(EOW) AS [Last Week], SUM(CASE WHEN A.COUNT1 = 0 THEN 1 ELSE 0 END) AS TOTAL
FROM
(
SELECT EMPID,EOW, Score
, SUM(CASE WHEN SCORE >= 50 THEN 0 ELSE 1 END) OVER (PARTITION BY EMPID ORDER BY EOW DESC) AS COUNT1
FROM TEST
GROUP BY EMPID,EOW,Score
)A
GROUP BY A.EmpID
)B
测试结果: