用 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
我有以下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