gpt4 book ai didi

sql - 查找最早但活跃的以下操作

转载 作者:行者123 更新时间:2023-11-29 12:02:56 24 4
gpt4 key购买 nike

我的表格是这样的:

+----+-----------+--------+------------------------+
| ID | type | userID | time |
+----+-----------+--------+------------------------+
| 1 | FOLLOW | 1 | 2017-09-22 13:47:00+00 |
| 2 | FOLLOW | 2 | 2017-09-22 13:48:00+00 |
| 3 | FOLLOW | 3 | 2017-09-22 13:49:00+00 |
| 4 | UNFOLLOW | 1 | 2017-09-22 13:50:00+00 |
| 5 | UNFOLLOW | 3 | 2017-09-22 13:51:00+00 |
| 6 | FOLLOW | 3 | 2017-09-22 13:52:00+00 |
| 7 | FOLLOW | 4 | 2017-09-22 13:53:00+00 |
| 8 | FOLLOW | 1 | 2017-09-22 13:54:00+00 |
| 9 | UNFOLLOW | 2 | 2017-09-22 13:55:00+00 |
+----+-----------+--------+------------------------+

它描述了用户执行的所有后续操作。我正在尝试编写一个查询,它会找到最旧但仍处于事件状态的 FOLLOW 操作。 Active 意味着之后没有 UNFOLLOW 操作。我找不到适用于单个查询的解决方案。

在此示例中,结果应为第 6 行。

Fiddle with example data

最佳答案

嗯。这是一种使用 not exists 的方法:

select distinct on (userId) t.*
from t
where not exists (select 1
from t t2
where t2.userId = t.userId and t2.type = 'UNFOLLOW' and
t2.time > t.time
) and
t.type = 'FOLLOW'
order by t.userId, t.time asc;

这会返回旧的活跃关注每个用户 id

编辑:

以上假设您想要每个用户的信息——这对我来说很有意义。但是如果你想要最旧的,那么:

select t.*
from actions t
where not exists (select 1
from actions t2
where t2.userId = t.userId and t2.type = 'UNFOLLOW' and t2.time > t.time
) and
t.type = 'FOLLOW'
order by t.time asc
fetch first 1 row only;

Here是这个版本的 SQL Fiddle。

关于sql - 查找最早但活跃的以下操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46755839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com