根据单独的数字列计算连续周数
Posted
技术标签:
【中文标题】根据单独的数字列计算连续周数【英文标题】:Counting Consecutive Weeks based on separate numeric column 【发布时间】:2019-07-10 21:31:48 【问题描述】:我正在解决员工每周获得一定分数的问题。他们每周只有 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
这有意义吗?任何帮助将不胜感激
【问题讨论】:
【参考方案1】:我使用了条件聚合和运行总计。
基本思路是:
如果数字 >= 50,则派生列的总和为 0。
连续的零将在第一个
然后数零的个数。
我添加了特殊情况[D组]:
('D','7/6/2019' , 51 )
('D','6/29/2019' , 49)
('D','6/22/2019' ,52 )
在这种情况下会有一个零。
如果只有一个零,我认为连续几周应该是零而不是一。
我在测试样本中添加了[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
测试结果:
DB<>Fiddle
【讨论】:
以上是关于根据单独的数字列计算连续周数的主要内容,如果未能解决你的问题,请参考以下文章