如何在比较两个不同行的列值时查询表



>假设我有一个foo表,其中相关列flagdateusername

我正在努力想出一个执行以下操作的PostgreSQL查询:

选择所有行...

  • date晚于特定日期
  • flag = 0
  • 并且没有更高date的其他行,并且同一用户具有flag = 1

。按username分组。

问题很大程度上是上面列表中的第三个要求。我尝试使用带有EXCEPTWHERE NOT EXISTSWITHLATERAL的子查询来构建查询,但是当子查询的日期必须相互比较并且我无法引用它们时,我总是会遇到死胡同。

这在单个 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

最新更新