我有一张看起来像这样的表:
+---------------------------------------------+
| EVENT_ID | ITEM_ID | PERSON_ID | EVENT_DATE |
+---------------------------------------------+
| 123 | 1 | 2 | 21-AUG-03 |
| 124 | 1 | 3 | 22-AUG-03 |
| 125 | 1 | 45 | 23-AUG-03 |
| 126 | 1 | (null) | 24-AUG-03 |
| 127 | 2 | 2 | 25-AUG-03 |
| 128 | 2 | 6 | 26-AUG-03 |
| 129 | 2 | 1 | 27-AUG-03 |
+---------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
因此,我需要获取每个 item_id 的最新 (MAX(event_date)) 非空 person_id。我们为此提出了一个相当简单的 PL/SQL 方法,但试图用直接的 SQL 完成工作。有人有想法吗?
顺便提一下, event_id 并不总是像这样是连续的。我们有两个冗余的数据库服务器。
提前致谢。
以下只需要一次全表扫描。
SELECT Item_ID, Person_ID, Event_Date FROM
(
SELECT Event_ID, Person_ID, Item_ID, Event_Date
, MAX(EVENT_DATE) OVER (PARTITION BY Item_ID) HighEventDate
FROM Event_Table WHERE Person_ID IS NOT NULL
)
WHERE Event_Date = HighEventDate;
Run Code Online (Sandbox Code Playgroud)
尝试这个
create table event_table (
event_id int,
item_id int,
person_id int,
event_date date
);
insert into event_table values (123, 1, 2, to_date('21-aug-03','DD-MON-YY'));
insert into event_table values (124, 1, 3, to_date('22-aug-03','DD-MON-YY'));
insert into event_table values (125, 1, 45, to_date('23-aug-03','DD-MON-YY'));
insert into event_table values (126, 1, null, to_date('24-aug-03','DD-MON-YY'));
insert into event_table values (127, 2, 2, to_date('25-aug-03','DD-MON-YY'));
insert into event_table values (128, 2, 6, to_date('26-aug-03','DD-MON-YY'));
insert into event_table values (129, 2, 1, to_date('27-aug-03','DD-MON-YY'));
select * from event_table;
select t1.item_id, t1.Person_id, t1.event_date
from event_table t1
join
(select item_id , max(event_date) max_event_date
from event_table where Person_id is not null group by item_id ) t2
on t1.item_id = t2.item_id and t1.event_date = t2.max_event_date;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3715 次 |
最近记录: |