简体   繁体   English

Oracle SQL 查询到 Select 每小时最新员工条目

[英]Oracle SQL Query to Select Latest Employee Entries Per Each Hour

How would I modify the following SQL query code to return the latest entry of each employee per hour, instead of currently returning every occurrence from each employee regardless of how many times it appears in the query per each hour.我将如何修改以下 SQL 查询代码以返回每个员工每小时的最新条目,而不是当前返回每个员工的每个事件,而不管它每小时在查询中出现多少次。

I've attached example data for the order of what currently would be in the database and the desired table output. Note: you can see it's in descending order and 2 entries (0001 and 0009) are omitted because they came from the same employees within an hour interval.我附上了数据库中当前顺序的示例数据和所需的表 output。注意:您可以看到它是按降序排列的,并且省略了 2 个条目(0001 和 0009),因为它们来自内部的相同员工一个小时的间隔。

SQL Query Code: 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;

This is the current order of the data in the database:这是数据库中数据的当前顺序:

TRANSACTION_ID交易编号 EMPLOYEE_ID员工ID FIRST_NAME LAST_NAME TIME_STAMP时间戳
0001 0001 AAAA AAAA级 Adam亚当 Akbar阿克巴 10/05/2021 04:42:42.000 PM 10/05/2021 04:42:42.000 下午
0004 0004 BBBB BBBB Barry巴里 Brink边缘 10/06/2021 07:25:25.000 AM 10/06/2021 07:25:25.000 上午
0003 0003 CCCC中国交建 Charlie查理 Che 10/06/2021 07:15:15.000 AM 10/06/2021 07:15:15.000 上午
0005 0005 DDDD DDDD David大卫 Doe母鹿 10/06/2021 07:27:27.000 AM 10/06/2021 07:27:27.000 上午
0006 0006 EEEE EEEE Eric埃里克 Erickson埃里克森 10/06/2021 07:29:29.000 AM 10/06/2021 07:29:29.000 上午
0007 0007 FFFF FFFF Fred弗雷德 Foe敌人 10/06/2021 07:31:31.000 AM 10/06/2021 07:31:31.000 上午
0008 0008 GGGG啊啊啊 George乔治 Guy家伙 10/06/2021 07:33:33.000 AM 10/06/2021 07:33:33.000 上午
0010 0010 HHHH啊啊啊 Henry亨利 Hugh 10/06/2021 07:55:55.000 AM 10/06/2021 07:55:55.000 上午
0009 0009 HHHH啊啊啊 Henry亨利 Hugh 10/06/2021 07:54:54.000 AM 10/06/2021 07:54:54.000 上午
0002 0002 AAAA AAAA级 Adam亚当 Akbar阿克巴 10/05/2021 04:43:43.000 PM 10/05/2021 04:43:43.000 下午

This is what should be returned:这是应该返回的内容:

TRANSACTION_ID交易编号 EMPLOYEE_ID员工ID FIRST_NAME LAST_NAME TIME_STAMP时间戳
0010 0010 HHHH啊啊啊 Henry亨利 Hugh 10/06/2021 07:55:55.000 AM 10/06/2021 07:55:55.000 上午
0008 0008 GGGG啊啊啊 George乔治 Guy家伙 10/06/2021 07:33:33.000 AM 10/06/2021 07:33:33.000 上午
0007 0007 FFFF FFFF Fred弗雷德 Foe敌人 10/06/2021 07:31:31.000 AM 10/06/2021 07:31:31.000 上午
0006 0006 EEEE EEEE Eric埃里克 Erickson埃里克森 10/06/2021 07:29:29.000 AM 10/06/2021 07:29:29.000 上午
0005 0005 DDDD DDDD David大卫 Doe母鹿 10/06/2021 07:27:27.000 AM 10/06/2021 07:27:27.000 上午
0004 0004 BBBB BBBB Barry巴里 Brink边缘 10/06/2021 07:25:25.000 AM 10/06/2021 07:25:25.000 上午
0003 0003 CCCC中国交建 Charlie查理 Che 10/06/2021 07:15:15.000 AM 10/06/2021 07:15:15.000 上午
0002 0002 AAAA AAAA级 Adam亚当 Akbar阿克巴 10/05/2021 04:43:43.000 PM 10/05/2021 04:43:43.000 下午

However, this is what the code is currently returning as written:但是,这是代码当前返回的内容:

TRANSACTION_ID交易编号 EMPLOYEE_ID员工ID FIRST_NAME LAST_NAME TIME_STAMP时间戳
0010 0010 HHHH啊啊啊 Henry亨利 Hugh 10/06/2021 07:55:55.000 AM 10/06/2021 07:55:55.000 上午
0006 0006 EEEE EEEE Eric埃里克 Erickson埃里克森 10/06/2021 07:29:29.000 AM 10/06/2021 07:29:29.000 上午
0003 0003 CCCC中国交建 Charlie查理 Che 10/06/2021 07:15:15.000 AM 10/06/2021 07:15:15.000 上午
0002 0002 AAAA AAAA级 Adam亚当 Akbar阿克巴 10/05/2021 04:43:43.000 PM 10/05/2021 04:43:43.000 下午

Any idea what I'm missing and how I can fix it?知道我缺少什么以及如何解决它吗?

The query ( in order to return what you want ) should work as this.查询(为了返回你想要的)应该像这样工作。 However., I am assuming your field time_stamp is really a timestamp in the format you provided.但是,我假设您的字段time_stamp实际上是您提供的格式的时间戳。

SQL> set lines 220
SQL> with x ( transaction_id , employee_id, first_name, last_name, time_stamp )
  2  as
  3  (
  4  select '0001' , 'AAAA', 'Adam'       , 'Akbar'     , to_timestamp('10/05/2021 04:42:42.000 PM','MM/DD/YYYY HH:MI:SS.FF3 PM') from dual union all
  5  select '0004' , 'BBBB', 'Barry'      , 'Brink'     , to_timestamp('10/06/2021 07:25:25.000 AM','MM/DD/YYYY HH:MI:SS.FF3 AM') from dual union all
  6  select '0003' , 'CCCC', 'Charlie' , 'Che'      , to_timestamp('10/06/2021 07:15:15.000 AM','MM/DD/YYYY HH:MI:SS.FF3 AM') from dual union all
  7  select '0005' , 'DDDD', 'David'      , 'Doe'           , to_timestamp('10/06/2021 07:27:27.000 AM','MM/DD/YYYY HH:MI:SS.FF3 AM') from dual union all
  8  select '0006' , 'EEEE', 'Eric'       , 'Erickson'  , to_timestamp('10/06/2021 07:29:29.000 AM','MM/DD/YYYY HH:MI:SS.FF3 AM') from dual union all
  9  select '0007' , 'FFFF', 'Fred'       , 'Foe'           , to_timestamp('10/06/2021 07:31:31.000 AM','MM/DD/YYYY HH:MI:SS.FF3 AM') from dual union all
 10  select '0008' , 'GGGG', 'George'  , 'Guy'      , to_timestamp('10/06/2021 07:33:33.000 AM','MM/DD/YYYY HH:MI:SS.FF3 AM') from dual union all
 11  select '0010' , 'HHHH', 'Henry'      , 'Hugh'          , to_timestamp('10/06/2021 07:55:55.000 AM','MM/DD/YYYY HH:MI:SS.FF3 AM') from dual union all
 12  select '0009' , 'HHHH', 'Henry'      , 'Hugh'          , to_timestamp('10/06/2021 07:54:54.000 AM','MM/DD/YYYY HH:MI:SS.FF3 AM') from dual union all
 13  select '0002' , 'AAAA', 'Adam'       , 'Akbar'         , to_timestamp('10/05/2021 04:43:43.000 PM','MM/DD/YYYY HH:MI:SS.FF3 PM') from dual
 14  )
 15  select
 16       TRANSACTION_ID ,
 17       EMPLOYEE_ID    ,
 18       FIRST_NAME     ,
 19       LAST_NAME      ,
 20       TIME_STAMP
 21  from (select x.*,
 22               row_number() over (partition by EMPLOYEE_ID, trunc(TIME_STAMP, 'HH') order by TIME_STAMP desc) as SEQNUM
 23        from x
 24       )
 25  where SEQNUM = 1
 26* order by TRANSACTION_ID desc

TRAN EMPL FIRST_N LAST_NAM TIME_STAMP
---- ---- ------- -------- ---------------------------------------------------------------------------
0010 HHHH Henry   Hugh     06-OCT-21 07.55.55.000000000 AM
0008 GGGG George  Guy      06-OCT-21 07.33.33.000000000 AM
0007 FFFF Fred    Foe      06-OCT-21 07.31.31.000000000 AM
0006 EEEE Eric    Erickson 06-OCT-21 07.29.29.000000000 AM
0005 DDDD David   Doe      06-OCT-21 07.27.27.000000000 AM
0004 BBBB Barry   Brink    06-OCT-21 07.25.25.000000000 AM
0003 CCCC Charlie Che      06-OCT-21 07.15.15.000000000 AM
0002 AAAA Adam    Akbar    05-OCT-21 04.43.43.000000000 PM

8 rows selected.

SQL>

Your query is:您的查询是:

  • missing commas between the terms in the SELECT clause; SELECT子句中的条款之间缺少逗号; and
  • has a ;有一个; after the WHERE filter and before the ORDER BY clause.WHERE过滤器之后和ORDER BY子句之前。

If you fix those issues then you get the code:如果您解决了这些问题,那么您将获得代码:

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;

Which, for the sample data:其中,对于样本数据:

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;

Works as expected:按预期工作:

TRANSACTION_ID交易编号 EMPLOYEE_ID员工ID FIRST_NAME LAST_NAME TIME_STAMP时间戳
0010 0010 HHHH啊啊啊 Henry亨利 Hugh 10-JUN-21 07.55.55.000000000 10-JUN-21 07.55.55.000000000
0008 0008 GGGG啊啊啊 George乔治 Guy家伙 10-JUN-21 07.33.33.000000000 10-JUN-21 07.33.33.000000000
0007 0007 FFFF FFFF Fred弗雷德 Foe敌人 10-JUN-21 07.31.31.000000000 10-JUN-21 07.31.31.000000000
0006 0006 EEEE EEEE Eric埃里克 Erickson埃里克森 10-JUN-21 07.29.29.000000000 10-JUN-21 07.29.29.000000000
0005 0005 DDDD DDDD David大卫 Doe母鹿 10-JUN-21 07.27.27.000000000 10-JUN-21 07.27.27.000000000
0004 0004 BBBB BBBB Barry巴里 Brink边缘 10-JUN-21 07.25.25.000000000 10-JUN-21 07.25.25.000000000
0003 0003 CCCC中国交建 Charlie查理 Che 10-JUN-21 07.15.15.000000000 10-JUN-21 07.15.15.000000000
0002 0002 AAAA AAAA级 Adam亚当 Akbar阿克巴 10-MAY-21 16.43.43.000000000 21 年 5 月 10 日 16.43.43.000000000

db<>fiddle here db<> 在这里摆弄

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM