我有一个操作日志表,记录compnay员工查看注册人记录的时间。我有这样的SQL查询:
SELECT [ID]
,[RegistrantID]
,[EmployeeID]
,[UserID]
,[CompanyID]
,[VacancyID]
,[Action]
,[ActionDate]
FROM [Hrge].[dbo].[hr_ActionLog]
where action = 4
and CompanyID = 3
order by ActionDate desc
和数据是这样的:
ID RegistrantID EmployeeID UserID CompanyID VacancyID Action ActionDate
1793 16295 15 16321 3 NULL 4 2013-08-04 16:45:40.457
1792 16292 15 16321 3 NULL 4 2013-08-04 16:45:33.003
1791 NULL 15 16321 3 NULL 3 2013-08-04 16:45:23.660
1790 16295 9 16289 3 NULL 4 2013-08-04 16:45:09.543
1789 16295 9 16289 3 NULL 4 2013-08-04 16:45:00.817
1799 16295 15 16321 3 NULL 4 2012-08-04 16:45:40.457
1797 16292 15 16321 3 NULL 4 2012-08-04 16:45:33.003
1796 NULL 15 16321 3 NULL 3 2012-08-04 16:45:23.660
1795 16295 9 16289 3 NULL 4 2012-08-04 16:45:09.543
1794 16295 9 16289 3 NULL 4 2012-08-04 16:45:00.817
我希望在一年内为注册记录(第一个)选择不同的视图。如果注册人每年10点被查看,那么它将仅在第一次被查看时显示。如果它在2年内由一名雇员观看了10次,那么它将首次显示它被观看。如果同一公司的2名员工在一年内10次观看,则会首次显示观看记录。如果在一年内两个不同公司的2名员工被看到10次,那么将展示两家公司的第一份记录。我是否需要使用group by或what?
答案 0 :(得分:1)
使用the ranking function ROW_NUMBER
与PARTITION BY RegistrantID ORDER BY ActionDate
一起获取每个RegistrantID
的第一个日期:
WITH CTE AS
(
SELECT *,
ROW_NUMBER() OVER(PARTITION BY RegistrantID
ORDER BY ActionDate) AS RN
FROM [Hrge].[dbo].[hr_ActionLog]
WHERE action = 4
AND CompanyID = 3
)
SELECT [ID]
,[RegistrantID]
,[EmployeeID]
,[UserID]
,[CompanyID]
,[VacancyID]
,[Action]
,[ActionDate]
FROM CTE
WHERE RN = 1;