使用 SQL 识别表中的模式

问题描述 投票:0回答:2

我有下表

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

提前感谢您的帮助。

mysql sql datetime aggregate-functions min
2个回答
1
投票

如果我没听错,您可以使用两个级别的聚合:

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
有多个不同的最小日期,那么我们就知道稍后会出现一项新活动。


1
投票

您可以使用聚合并使用以下方法获取每个 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
© www.soinside.com 2019 - 2024. All rights reserved.