用 SQL 识别 table 中的模式

Recognizing patterns in a table with SQL

我有以下table

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 代表一个在特定日期执行 activity 的唯一人员。一个人可能在同一天执行多项活动(ID 1 在同一天多次执行 activity X 和 Y),这在 table.

中记录为两个单独的条目

我需要一个 SQL 查询,其中 return 曾经执行过与第一天执行的任务不同 activity 的人员的所有 ID。新的 activity 不能是第一个 activity 的子集(如果 ID 1 在某一天执行 X 和 Y,然后在另一天执行 X,这不算是不同的 activity) .

我使用 min(date) 找到 activity 的第一次约会,但我无法处理在同一天进行多项活动的情况。此外,我的查询需要大约 1 分钟才能到达 运行,这令人惊讶,因为我只有 2000 条记录。

上面 table 上的查询 运行 理想情况下应该 return 以下内容:

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 有不止一个不同的最小日期,那么我们知道一个新的 activity 稍后出现。

您可以使用聚合并使用以下方法获取每个 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