Как запросить таблицу при сравнении значений столбцов двух разных строк? - PullRequest
0 голосов
/ 17 мая 2018

Предположим, у меня есть одна таблица foo с соответствующими столбцами flag, date и username.

Я пытаюсь найти запрос PostgreSQL, который выполняет следующее:

Выбрать все строки, где ...

  • date позже определенной даты
  • и flag = 0
  • и НЕТ другой строки более поздней date и с flag = 1 для того же пользователя

... сгруппированы по username.

Эта проблема - третье требование в списке выше. Я пытался построить запрос, используя подзапросы с EXCEPT, WHERE NOT EXISTS, WITH и LATERAL, но я всегда захожу в тупик, когда даты подзапросов должны сравниваться друг с другом, и я не могу ссылаться на них .

Возможно ли это в пределах одного оператора SQL?

1 Ответ

0 голосов
/ 17 мая 2018

Это очень похоже на 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...