Выберите одну запись с заданным статусом из набора повторяющихся записей с хотя бы этим одним статусом - PullRequest
0 голосов
/ 09 мая 2018

У меня есть система, которая запрашивает информацию, отправляя во внешнюю систему 3 параметра: user, start_date и end_date.

У меня есть таблица

request (
  id, 
  user, 
  start_date, 
  end_date, 
  status
) 

, в которой регистрируются эти запросы и их состояние (Done для запросов, которые вернулись, Waiting для запросов, которые еще не вернулись).

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

Через некоторое время моя таблица будет иметь несколько запросов для одного и того же пользователя / start_date / end_date, некоторые из них ожидающие, некоторые выполненные.

Мне нужен запрос, который возвращает список идентификаторов всех повторяющихся запросов, за исключением 1 Готово, где хотя бы один запрос имеет статус = Готово.

Таким образом, мне нужен способ очистить превышающие запросы для данного пользователя / start_date / end_date, если хотя бы один из них имеет статус = Done (не важно, какой, мне просто нужно сохранить 1 статус= Готово для данного пользователя / start_date / end_date).

До сих пор мне удавалось точно определить дубликаты запросов, по крайней мере 1 выполненных.Чтобы выбрать из этого запроса все, кроме одного, я, скорее всего, обернул бы весь этот запрос еще в 2 выбора и выполнил бы всю работу, но запрос как таковой уже очень медленный.Может ли кто-нибудь помочь мне изменить его и выбрать конечный результат, который мне нужен?

http://sqlfiddle.com/#!5/10c25a/1

Я использую SQLite

Ожидаемый результат от набора данных, представленного в sqlfiddle, следующий:

454, 457, 603, (604 or 605 not both), 607, 608

Ответы [ 2 ]

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

Что вы ищете, записи, которые соответствуют этому критерию ...

  • Существует еще одна запись с Status "Готово"
  • Эта другая запись "Готово" соответствует user, start_date и end_date
  • Эта другая запись имеет меньшее значение id (потому что вам нужно что-то , чтобы идентифицировать запись для keep ) или другая запись имеет более высокое значение id но запись, на которую вы смотрите, имеет Status "Ожидание"

Имея все это в виду, вот ваш запрос

SELECT id FROM request r1
WHERE EXISTS (
  SELECT 1 FROM request r2
  WHERE r2.Status = 'Done'
  AND r1.user = r2.user
  AND r1.start_date = r2.start_date
  AND r1.end_date = r2.end_date
  AND (r1.id > r2.id OR r1.Status = 'Waiting')
)
ORDER BY id

http://sqlfiddle.com/#!5/10c25a/26 ~ производит идентификаторы 454, 457, 603, 605, 607 и 608

0 голосов
/ 09 мая 2018
select r.id from request r inner join (
    select user, start_date, end_date,
        min(case when status = 'Done' then id end) as keep_id
    from request
    group by user, start_date, end_date
    having count(case when status = 'Done' then 1 end) > 0 and count(*) > 1
) s on  s.user = r.user and s.start_date = r.start_date and s.end_date = r.end_date
    and s.keep_id <> r.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...