我有一个数据集,我在一段时间内记录了用户的不同活动,因此我有多个用户在不同的日子里有多个活动。
我正在寻找已经提交了15日和16日事件B的所有用户,然后想要只提取事件B的最后一次出现,以防多个事件存在。
示例数据集:
User Event Event_Date Event_Time
==== ===== ========== =================================
1 A 15-May-13 15-MAY-13 05.46.20.000000000 AM
2 A 15-May-13 15-MAY-13 09.33.22.000000000 AM
3 A 15-May-13 15-MAY-13 09.47.50.000000000 AM
4 A 15-May-13 15-MAY-13 09.59.53.000000000 AM
5 A 15-May-13 15-MAY-13 10.12.25.000000000 AM
1 B 15-May-13 15-MAY-13 05.46.20.000000000 AM
1 B 15-May-13 15-MAY-13 09.33.22.000000000 AM
**1 B 15-May-13 15-MAY-13 09.47.50.000000000 AM**
**3 B 15-May-13 15-MAY-13 09.59.53.000000000 AM**
5 B 15-May-13 15-MAY-13 10.12.25.000000000 AM
**5 B 15-May-13 15-MAY-13 10.30.25.000000000 AM**
1 A 16-May-13 16-MAY-13 01.23.00.000000000 AM
1 B 16-May-13 16-MAY-13 01.28.35.000000000 AM
**1 B 16-May-13 16-MAY-13 01.28.43.000000000 AM**
3 A 16-May-13 16-MAY-13 08.38.06.000000000 PM
**3 B 16-May-13 16-MAY-13 12.05.53.000000000 AM**
4 A 16-May-13 16-MAY-13 12.21.57.000000000 AM
**4 B 16-May-13 16-MAY-13 05.21.57.000000000 PM**
对于具有事件B的所有用户,特定日期的最后一个事件的事件日期(如果事件有多个记录)和日期,结果集应如下所示。
User Event Event_Date Event_Time
==== ===== ========== =================================
1 B 15-May-13
3 B 15-May-13
5 B 15-May-13
1 B 16-May-13
3 B 16-May-13
4 B 16-May-13
以下查询为我提供了一天的正确结果,但是当我尝试一系列日期时,它只提供最近的事件。
select user, event, event_date, max(event_time)
from table_A where event = 'B'
and event_date = '15-May-13'
group by user, event, event_date
答案 0 :(得分:1)
select a1.user, a1.event, a1.event_date, a1.event_time
from table_A a1
where a1.event ='B'
and a1.event_date <='15-May-13'
and a1.event_date >='01-May-13'
and a1.event_time = (select max(event_time)
from table_A a2
where a2.event = a1.event
and a2.event_date = a1.event_date
and a2.user = a1.user)
相关子查询获取主查询检索的每一行的最长时间。在这种情况下,我们将获得每个事件的最大时间,event_date和user。
答案 1 :(得分:1)
您没有说明您的DBMS,因此这是ANSI SQL:
select username,
event,
event_date,
event_time
from (
select "USER" as username,
event,
event_date,
event_time
row_number() over (partition by "USER", event order by event_time desc) as rn
from table_a
where event = 'B'
and event_date between date '2013-05-13' and date '2013-05-15'
) t
where rn = 1;
请注意USER
是一个保留字,因此需要引用它(为方便起见,我将其“重命名为”它)。我还使用ANSI日期文字来使日期解析更稳定,并且独立于任何语言/环境设置。