我有下表
ID Date Activity
1 10-20-2019 X
1 10-20-2019 Y
1 10-23-2019 X
1 10-23-2019 Y
1 10-25-2019 Z
2 10-10-2019 X
2 10-15-2019 X
2 10-16-2019 X
2 10-20-2020 X
3 10-12-2020 X
3 10-13-2020 X
3 10-14-2020 Y
3 10-15-2020 Y
4 10-10-2020. Y
4 10-12-2020 Y
4 10-15-2020 Z
4 10-15-2020 Z
每个 ID 代表在特定日期执行活动的唯一人员。一个人可以在同一天执行多项活动(ID 1 在同一天多次执行活动 X 和 Y),这在表中记录为两个单独的条目。
我需要一个 SQL 查询,返回曾经执行过与第一天执行的任务不同的活动的人员的所有 ID。新活动不能是第一个活动的子集(如果 ID 1 在某一天执行 X 和 Y,然后在另一天执行 X,则这不算是不同的活动)。
我使用 min(date) 来查找他们第一次约会时的活动,但我在处理在同一天执行多项活动的情况时遇到困难。另外,我的查询运行大约需要 1 分钟,考虑到我只有 2000 条记录,这令人惊讶。
在上表上运行的查询理想情况下应返回以下内容:
ID
1
3
4
提前感谢您的帮助。
如果我没听错,您可以使用两个级别的聚合:
select id
from (
select id, activity, min(date) min_date
from mytable t
group by id, activity
) t
group by id
having min(min_date) <> max(min_date)
这个想法是计算每个
id
*和 activity
的最小日期。如果给定的 id
有多个不同的最小日期,那么我们就知道稍后会出现一项新活动。
您可以使用聚合并使用以下方法获取每个 id 的活动:
select t.*
from (select t.id, activity,
min(date) as min(date) as min_activity_date,
min(min(date)) over (partition by id) as min_date
from t
group by id, activity
) t
where min_activity_date > min_date