假设我有一个表foo
,其中包含相关列flag
,date
和username
。
我正在努力想出一个执行以下操作的PostgreSQL查询:
选择所有行......
date
晚于特定日期flag = 0
date
和flag = 1
对于同一个用户没有其他行 ...按username
分组。
问题是上面列表中的第三个要求。我尝试使用带有EXCEPT
,WHERE NOT EXISTS
,WITH
和LATERAL
的子查询来构建查询,但是当必须比较子查询的日期时,我总是遇到死胡同相互之间我无法引用它们。
这是否可以在单个SQL语句中使用?
答案 0 :(得分:1)
这看起来很像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
。