Как рассчитывать на 3 месяца подряд или более из столбца Дата в SQL Server? - PullRequest
0 голосов
/ 07 октября 2019

Click here for Small Sample Data for reference

Я пытаюсь, чтобы мой запрос СЧИТАЛ количество строк пользователя, но у них есть 3 + месячные последовательные данные (иначе как пропущенные строки). Мне было интересно, как вы можете определить из столбца даты, прошел ли сотрудник 3 месяца подряд или более данных / строк в таблице?

Я пытался использовать функцию COUNT и пытался использовать временные таблицы. но хотел посмотреть, есть ли лучший способ подсчитать каждого пользователя по его отделам, которые проводят 3 месяца подряд или более?

Output Data

DECLARE @TotalUserCount AS INT
SELECT @TotalUserCount = COUNT(DISTINCT [User_ID])
FROM [dbo].[Employee_Monthly_Raw]

SELECT DISTINCT a.Department AS 'Dep', @TotalUserCount AS 'Total_User_Count'
FROM
    (SELECT DISTINCT 
    RTRIM(LTRIM([Department])) AS 'Dep',
    [User_ID] AS 'User_ID',
    COUNT(ALL @TotalUserCount) AS 'Total_User_Count',
    COUNT(DISTINCT [Date]) AS 'Baseline',
    FROM [dbo].[Employee_Monthly_Raw]
    WHERE 
    [User_ID] IS NOT NULL

    GROUP BY [Dep],[User_ID]
        HAVING COUNT(DISTINCT [Date]) >= '6') AS a

GROUP BY [Department]
ORDER BY [Department]

Ожидаемые результаты должны пройти подсчетЭЭ (сгруппированные по отделам), в которых они передают данные за 3 месяца или более из столбца «Дата», который вводится в формате первого месяца (т. Е. «01/01/2019»)

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Если для каждой строки вы хотите знать, есть ли три месяца с одинаковыми значениями, тогда вы можете использовать lag():

select emr.*,
       (case when lag(month, 2) over (partition by user_id, department order by date) = dateadd(month, -2, date)
             then 1 else 0
        end) as three_month_flag
from Employee_Monthly_Raw emr;

Я не уверен, что это имеет отношение кагрегация у вас в вопросе.

0 голосов
/ 07 октября 2019

Если я вас правильно понимаю, вы хотите, чтобы количество сотрудников, которые работали (или отображались в предоставленной вами таблице примеров) за последние 3 месяца

Так что это будет примерно так

Select Count(distinct UserID) as Number_of_Employees,
       Department
From [dbo].[Employee_Monthly_Raw]
Where datepart(month,Cast(Date as date)) = datepart(month,dateadd(month,-3,getdate()))
Group by Department
Order by Department
...