在SQL中使用group by选择不同的数据

时间:2013-08-04 12:00:26

标签: sql sql-server sql-server-2008 tsql

我有一个操作日志表,记录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?

1 个答案:

答案 0 :(得分:1)

使用the ranking function 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;