>假设我有一个foo
表,其中相关列flag
、date
和username
。
我正在努力想出一个执行以下操作的PostgreSQL查询:
选择所有行...
date
晚于特定日期- 和
flag = 0
- 并且没有更高
date
的其他行,并且同一用户具有flag = 1
。按username
分组。
问题很大程度上是上面列表中的第三个要求。我尝试使用带有EXCEPT
、WHERE NOT EXISTS
、WITH
和LATERAL
的子查询来构建查询,但是当子查询的日期必须相互比较并且我无法引用它们时,我总是会遇到死胡同。
这在单个 SQL 语句中可能吗?
这看起来很像not exists
:
select t.*
from t
where date > ? and flag = 0 and
not exists (select 1
from t t2
where t2.username = t.username and t2.flag = 1 and t2.date > t.date
);
如果您只想让用户名满足条件,条件聚合就足够了:
select username
from t
where date > ?
group by username
having min(case when flag = 0 then date end) < max(case when flag = 1 then date end);
这是说最后的flag = 1
日期晚于最早的flag = 0
。