Подсчет последовательных недель по отдельному числовому столбцу - PullRequest
1 голос
/ 11 июля 2019

Я работаю над проблемой, когда сотрудники получают определенный балл каждую неделю.Они будут иметь только 1 балл каждую неделю, сохраняясь каждую субботу.Я хочу посчитать количество последовательных недель (работающих в обратном направлении с сегодняшнего дня), когда они превышают 50. Если предыдущая неделя не превышала 50, то у них было бы 0 последовательных недель.Если бы они набрали более 50 баллов каждую неделю в течение прошлого года, то у них было бы 52 недели подряд.

Я пытался использовать функцию Row_Number (), чтобы получить это, но не могу понять, как включить оценку как фактор в это.

Это пример данныхset:

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 голосов
/ 11 июля 2019

Я использовал условное агрегирование и промежуточный итог.

Основная идея:

Если число> = 50, производный столбец будет иметь значение 0.

Последовательныйноль (и) остановится на первом значении <50. </p>

Затем посчитайте количество нулей.

Я добавил специальный случай [группа 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...