Как получить минимальную дату каждого линейного менеджера против каждого сотрудника - PullRequest
0 голосов
/ 15 октября 2019

У меня есть таблица сотрудников, где поля:

Reporting_Change_date, empid, empfullname, LineManagerID,LineManager_name, и т. Д. Меня просят найти минимальную дату изменения отчета для каждого сотрудника.

Я думал, что эту проблему можно решить следующим образом:

Данные

Reporting_Change_Date    |Emp Name      |Line Manager Name
-------------------------|--------------|-----------------
01-Jan-19                |Anand Kumar   |Amitabh
02-Jan-19                |Anand Kumar   |Amitabh
03-Jan-19                |Anand Kumar   |Amitabh
04-Jan-19                |Anand Kumar   |Amitabh
05-Jan-19                |Anand Kumar   |Sachin
06-Jan-19                |Anand Kumar   |Sachin
07-Jan-19                |Anand Kumar   |Sachin
08-Jan-19                |Anand Kumar   |DEEpak
09-Jan-19                |Anand Kumar   |DEEpak
10-Jan-19                |Anand Kumar   |DEEpak
11-Jan-19                |Anand Kumar   |Amitabh

Мне нужен такой вывод:

Reporting_Change_Date    |Emp Name      |Line Manager Name
-------------------------|--------------|-----------------
01-Jan-19                |Anand Kumar   |Amitabh
05-Jan-19                |Anand Kumar   |Sachin
08-Jan-19                |Anand Kumar   |DEEpak
11-Jan-19                |Anand Kumar   |Amitabh

Я пробовал этот код:

SELECT Min(metricdate)MetricDate, empid, linemanagername
FROM [HR_Mart].[Mart].[hr_nonadvisorbyday]
WHERE linemanagername <> 'Craig Nixon'
   AND empid = '245531'
GROUP BY empid, linemanagername
ORDER BY metricdate

Ответы [ 3 ]

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

То, что у вас есть, это проблема пробелов и островков. Менеджер пользователя изменил back на предыдущее значение, поэтому значение MIN все еще является первым, когда этот человек был их менеджером. Одним из способов создания острова является использование ROW_NUMBER():

USE Sandbox;
GO
--Sample Table
CREATE TABLE dbo.hr_nonadvisorbyday(ReportingDate date,
                                    EmpName varchar(50),
                                    ManagerName varchar(50));


GO
--Sample data
INSERT INTO dbo.hr_nonadvisorbyday
VALUES('01-Jan-19','Anand Kumar','Amitabh'),
      ('02-Jan-19','Anand Kumar','Amitabh'),
      ('03-Jan-19','Anand Kumar','Amitabh'),
      ('04-Jan-19','Anand Kumar','Amitabh'),
      ('05-Jan-19','Anand Kumar','Sachin'),
      ('06-Jan-19','Anand Kumar','Sachin'),
      ('07-Jan-19','Anand Kumar','Sachin'),
      ('08-Jan-19','Anand Kumar','DEEpak'),
      ('09-Jan-19','Anand Kumar','DEEpak'),
      ('10-Jan-19','Anand Kumar','DEEpak'),
      ('11-Jan-19','Anand Kumar','Amitabh');

GO
--Your (heavily editted) Solution
SELECT Min(ReportingDate) MetricDate,
       EmpName,
       ManagerName
FROM dbo.[hr_nonadvisorbyday]
WHERE ManagerName <> 'Craig Nixon'
  AND EmpName = 'Anand Kumar'
GROUP BY EmpName,
         ManagerName
ORDER BY metricdate;
GO
--Solution
WITH Grps AS(
    SELECT ReportingDate,
           EmpName,
           ManagerName,
           ROW_NUMBER() OVER (PARTITION BY EmpName ORDER BY ReportingDate) - 
           ROW_NUMBER() OVER (PARTITION BY EmpName, ManagerName ORDER BY ReportingDate) AS Grp
    FROM dbo.hr_nonadvisorbyday
    WHERE ManagerName <> 'Craig Nixon'
      AND EmpName = 'Anand Kumar')
SELECT Min(ReportingDate) MetricDate,
       EmpName,
       ManagerName
FROM Grps
GROUP BY EmpName,
         ManagerName,
         Grp;

GO

--Clean up
DROP TABLE dbo.hr_nonadvisorbyday
0 голосов
/ 15 октября 2019

Вы можете использовать задержку и мин, как показано ниже:

;with cte_bucket as (
    select *, sum(nextlmn) over(order by reporting_change_date) bucket from (
        select *, case when linemanager_name <> lag(linemanager_name)  over(order by reporting_change_date) then 1 else 0 end as nextlmn from #employee
    ) a
)
select min(reporting_change_date) as reporting_change_date, empfullname, linemanager_name from cte_bucket
group by empfullname, linemanager_name, bucket 

Код ниже https://rextester.com/SVXZ36406

Вывод, как показано ниже:

+-----------------------+-------------+------------------+
| reporting_change_date | empfullname | linemanager_name |
+-----------------------+-------------+------------------+
| 2019-01-01            | Anand Kumar | Amitabh          |
| 2019-01-05            | Anand Kumar | Sachin           |
| 2019-01-08            | Anand Kumar | DEEpak           |
| 2019-01-11            | Anand Kumar | Amitabh          |
+-----------------------+-------------+------------------+
0 голосов
/ 15 октября 2019

Предполагая, что Reporting_Change_Date является типом данных даты, вы можете использовать следующий запрос:

    select 
    [Emp Name],   
    [Line Manager Name],
    min([Reporting_Change_Date]) as MinReporting_Change_Date
from employeetable
group by  
    [Emp Name]      
    [Line Manager Name] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...