1

我有一个操作日志表,它记录公司员工何时查看注册人记录。我有一个这样的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 还是什么?

4

1 回答 1

1

使用排名函数 ROW_NUMBERPARTITION 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;
于 2013-08-04T12:03:44.113 回答