根据单独的数字列计算连续星期

时间:2019-07-10 21:31:48

标签: sql tsql

我正在解决一个问题,即员工每周获得一定的分数。他们每周只有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 个答案:

答案 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

测试结果:

DB<>Fiddle