[英]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![]() |
FIRST_NAME![]() |
LAST_NAME![]() |
TIME_STAMP![]() |
---|---|---|---|---|
0001 ![]() |
AAAA ![]() |
Adam![]() |
Akbar![]() |
10/05/2021 04:42:42.000 PM ![]() |
0004 ![]() |
BBBB ![]() |
Barry![]() |
Brink![]() |
10/06/2021 07:25:25.000 AM ![]() |
0003 ![]() |
CCCC![]() |
Charlie![]() |
Che![]() |
10/06/2021 07:15:15.000 AM ![]() |
0005 ![]() |
DDDD ![]() |
David![]() |
Doe![]() |
10/06/2021 07:27:27.000 AM ![]() |
0006 ![]() |
EEEE ![]() |
Eric![]() |
Erickson![]() |
10/06/2021 07:29:29.000 AM ![]() |
0007 ![]() |
FFFF ![]() |
Fred![]() |
Foe![]() |
10/06/2021 07:31:31.000 AM ![]() |
0008 ![]() |
GGGG![]() |
George![]() |
Guy![]() |
10/06/2021 07:33:33.000 AM ![]() |
0010 ![]() |
HHHH![]() |
Henry![]() |
Hugh![]() |
10/06/2021 07:55:55.000 AM ![]() |
0009 ![]() |
HHHH![]() |
Henry![]() |
Hugh![]() |
10/06/2021 07:54:54.000 AM ![]() |
0002 ![]() |
AAAA ![]() |
Adam![]() |
Akbar![]() |
10/05/2021 04:43:43.000 PM ![]() |
This is what should be returned:这是应该返回的内容:
TRANSACTION_ID![]() |
EMPLOYEE_ID![]() |
FIRST_NAME![]() |
LAST_NAME![]() |
TIME_STAMP![]() |
---|---|---|---|---|
0010 ![]() |
HHHH![]() |
Henry![]() |
Hugh![]() |
10/06/2021 07:55:55.000 AM ![]() |
0008 ![]() |
GGGG![]() |
George![]() |
Guy![]() |
10/06/2021 07:33:33.000 AM ![]() |
0007 ![]() |
FFFF ![]() |
Fred![]() |
Foe![]() |
10/06/2021 07:31:31.000 AM ![]() |
0006 ![]() |
EEEE ![]() |
Eric![]() |
Erickson![]() |
10/06/2021 07:29:29.000 AM ![]() |
0005 ![]() |
DDDD ![]() |
David![]() |
Doe![]() |
10/06/2021 07:27:27.000 AM ![]() |
0004 ![]() |
BBBB ![]() |
Barry![]() |
Brink![]() |
10/06/2021 07:25:25.000 AM ![]() |
0003 ![]() |
CCCC![]() |
Charlie![]() |
Che![]() |
10/06/2021 07:15:15.000 AM ![]() |
0002 ![]() |
AAAA ![]() |
Adam![]() |
Akbar![]() |
10/05/2021 04:43:43.000 PM ![]() |
However, this is what the code is currently returning as written:但是,这是代码当前返回的内容:
TRANSACTION_ID![]() |
EMPLOYEE_ID![]() |
FIRST_NAME![]() |
LAST_NAME![]() |
TIME_STAMP![]() |
---|---|---|---|---|
0010 ![]() |
HHHH![]() |
Henry![]() |
Hugh![]() |
10/06/2021 07:55:55.000 AM ![]() |
0006 ![]() |
EEEE ![]() |
Eric![]() |
Erickson![]() |
10/06/2021 07:29:29.000 AM ![]() |
0003 ![]() |
CCCC![]() |
Charlie![]() |
Che![]() |
10/06/2021 07:15:15.000 AM ![]() |
0002 ![]() |
AAAA ![]() |
Adam![]() |
Akbar![]() |
10/05/2021 04:43:43.000 PM ![]() |
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:您的查询是:
SELECT
clause; SELECT
子句中的条款之间缺少逗号; and;
;
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.