SQL Возвращает строки на основе значения других строк - PullRequest
0 голосов
/ 29 апреля 2020

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

  • Когда вводится новая транзакция, столбец базы данных Action установлен на «Вставить», а столбец Modified установлен на «Нет».
  • Если происходит обновление, записываются 2 дополнительные строки Action = «Удалить»; Modified = "Да" И Action = "Вставить"; Modified = "Да".
  • Если транзакция удаляется, добавляется еще одна строка: Action = "Удалить"; Modified = "Нет"

Вот несколько примеров:

  • Сделка А была только вставлена. Поэтому мне нужно вернуть Record 1.
  • Сделка B была вставлена ​​и обновлена. Мне нужен запрос для возврата Record 4.
  • Сделка C была вставлена ​​и удалена. Запрос не должен возвращать сделку C.
  • Сделка D была вставлена ​​и обновлена ​​дважды. Мне нужно Record 11 для возврата.
  • Сделка E была вставлена, обновлена ​​дважды, а затем удалена. Запрос вообще не должен возвращать сделку E.

Sample Deals

Спасибо, Даниэль

1 Ответ

0 голосов
/ 29 апреля 2020

Если Я правильно следил за вами, вы можете отфильтровать последнюю запись по сделке с подзапросом, а затем игнорировать сделки, последний статус которых является удалением:

select t.*
from mytable t
where 
    t.record = (select max(t1.record) from mytable t1 where t1.dealID = t.dealID)
    and t.action <> 'Delete'

Насколько В этом случае вам не нужно использовать столбец modified, чтобы получить желаемый результат.

Для производительности с этим запросом рассмотрите индекс на (dealID, record, action).

. Вы можете также express это с row_number(), если ваша база данных поддерживает оконные функции:

select record, action, modified, dealID
from (
    select t.*, row_number() over(partition by dealID order by record desc) rn
    from mytable t
) t
where action <> 'Deleted'
...