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

时间:2018-05-17 14:52:05

标签: sql postgresql

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

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

选择所有行......

  • date晚于特定日期
  • flag = 0
  • 并且后一个dateflag = 1对于同一个用户没有其他行

...按username分组。

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

这是否可以在单个SQL语句中使用?

1 个答案:

答案 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