首页 > 解决方案 > 每小时选择最新员工条目的 Oracle SQL 查询

问题描述

我将如何修改以下 SQL 查询代码以每小时返回每个员工的最新条目,而不是当前返回每个员工的每个事件,而不管它每小时在查询中出现多少次。

我已经附加了示例数据,以了解当前在数据库中的顺序和所需的表输出。注意:您可以看到它是按降序排列的,并且省略了 2 个条目(0001 和 0009),因为它们在一个小时的间隔内来自相同的员工。

SQL查询代码:

select
     TRANSACTION_ID
     EMPLOYEE_ID
     FIRST_NAME
     LAST_NAME
     TIME_STAMP
from (select d.*,
             row_number() over (partition by EMPLOYEE_ID, trunc(TIME_STAMP, 'HH') order by TIME_STAMP desc) as SEQNUM
      from MAIN.DATABASE d
     ) d
where SEQNUM = 1;
order by TRANSACTION_ID desc;

这是数据库中数据的当前顺序:

TRANSACTION_ID 员工ID TIME_STAMP
0001 AAAA 亚当 阿克巴 2021 年 10 月 5 日下午 4:42:42.000
0004 BBBB 巴里 边缘 2021 年 10 月 6 日上午 07:25:25.000
0003 中国交建 查理 2021 年 10 月 6 日上午 07:15:15.000
0005 DDDD 大卫 能源部 2021 年 10 月 6 日上午 7:27:27.000
0006 电子电气设备 埃里克 埃里克森 2021 年 10 月 6 日上午 7:29:29.000
0007 FFFF 弗雷德 敌人 2021 年 10 月 6 日上午 07:31:31.000
0008 GGGG 乔治 盖伊 2021 年 10 月 6 日上午 7:33:33.000
0010 呼呼呼 亨利 2021 年 10 月 6 日上午 07:55:55.000
0009 呼呼呼 亨利 2021 年 10 月 6 日上午 7:54:54.000
0002 AAAA 亚当 阿克巴 2021 年 10 月 5 日下午 4:43:43.000

这是应该返回的:

TRANSACTION_ID 员工ID TIME_STAMP
0010 呼呼呼 亨利 2021 年 10 月 6 日上午 07:55:55.000
0008 GGGG 乔治 盖伊 2021 年 10 月 6 日上午 7:33:33.000
0007 FFFF 弗雷德 敌人 2021 年 10 月 6 日上午 07:31:31.000
0006 电子电气设备 埃里克 埃里克森 2021 年 10 月 6 日上午 7:29:29.000
0005 DDDD 大卫 能源部 2021 年 10 月 6 日上午 7:27:27.000
0004 BBBB 巴里 边缘 2021 年 10 月 6 日上午 07:25:25.000
0003 中国交建 查理 2021 年 10 月 6 日上午 07:15:15.000
0002 AAAA 亚当 阿克巴 2021 年 10 月 5 日下午 4:43:43.000

但是,这是代码当前返回的内容:

TRANSACTION_ID 员工ID TIME_STAMP
0010 呼呼呼 亨利 2021 年 10 月 6 日上午 07:55:55.000
0006 电子电气设备 埃里克 埃里克森 2021 年 10 月 6 日上午 7:29:29.000
0003 中国交建 查理 2021 年 10 月 6 日上午 07:15:15.000
0002 AAAA 亚当 阿克巴 2021 年 10 月 5 日下午 4:43:43.000

知道我缺少什么以及如何解决吗?

标签: sqloraclegreatest-n-per-group

解决方案


您的查询是:

  • 条款中的条款之间缺少逗号SELECT;和
  • ;WHERE过滤器之后和ORDER BY子句之前有一个。

如果你解决了这些问题,那么你会得到代码:

select TRANSACTION_ID,
       EMPLOYEE_ID,
       FIRST_NAME,
       LAST_NAME,
       TIME_STAMP
from   (
  select d.*,
         row_number() over (
           partition by EMPLOYEE_ID, trunc(TIME_STAMP, 'HH')
           order by TIME_STAMP desc
         ) as SEQNUM
  from   MAIN.DATABASE d
) d
where  SEQNUM = 1
order by TRANSACTION_ID desc;

其中,对于样本数据:

CREATE TABLE main.database (TRANSACTION_ID, EMPLOYEE_ID, FIRST_NAME, LAST_NAME, TIME_STAMP ) AS
SELECT '0001', 'AAAA', 'Adam',    'Akbar',    TIMESTAMP '2021-05-10 16:42:42.000' FROM DUAL UNION ALL
SELECT '0004', 'BBBB', 'Barry',   'Brink',    TIMESTAMP '2021-06-10 07:25:25.000' FROM DUAL UNION ALL
SELECT '0003', 'CCCC', 'Charlie', 'Che',      TIMESTAMP '2021-06-10 07:15:15.000' FROM DUAL UNION ALL
SELECT '0005', 'DDDD', 'David',   'Doe',      TIMESTAMP '2021-06-10 07:27:27.000' FROM DUAL UNION ALL
SELECT '0006', 'EEEE', 'Eric',    'Erickson', TIMESTAMP '2021-06-10 07:29:29.000' FROM DUAL UNION ALL
SELECT '0007', 'FFFF', 'Fred',    'Foe',      TIMESTAMP '2021-06-10 07:31:31.000' FROM DUAL UNION ALL
SELECT '0008', 'GGGG', 'George',  'Guy',      TIMESTAMP '2021-06-10 07:33:33.000' FROM DUAL UNION ALL
SELECT '0010', 'HHHH', 'Henry',   'Hugh',     TIMESTAMP '2021-06-10 07:55:55.000' FROM DUAL UNION ALL
SELECT '0009', 'HHHH', 'Henry',   'Hugh',     TIMESTAMP '2021-06-10 07:54:54.000' FROM DUAL UNION ALL
SELECT '0002', 'AAAA', 'Adam',    'Akbar',    TIMESTAMP '2021-05-10 16:43:43.000' FROM DUAL;

按预期工作:

TRANSACTION_ID 员工ID TIME_STAMP
0010 呼呼呼 亨利 21 年 6 月 10 日 07.55.55.000000000
0008 GGGG 乔治 盖伊 21 年 6 月 10 日 07.33.33.000000000
0007 FFFF 弗雷德 敌人 21 年 6 月 10 日 07.31.31.000000000
0006 电子电气设备 埃里克 埃里克森 21 年 6 月 10 日 07.29.29.000000000
0005 DDDD 大卫 美国能源部 21 年 6 月 10 日 07.27.27.000000000
0004 BBBB 巴里 边缘 21 年 6 月 10 日 07.25.25.000000000
0003 中国交建 查理 21 年 6 月 10 日 07.15.15.000000000
0002 AAAA 亚当 阿克巴 21 年 5 月 10 日 16.43.43.000000000

db<>在这里摆弄


推荐阅读