С SQLite> = 3.25 просто используйте оконную функцию ROW_NUMBER()
:
SELECT * FROM (
SELECT t.*, ROW_NUMBER() OVER(PARTITION BY t.parent_id ORDER BY t.date DESC) rn
FROM mytable t
) x WHERE rn = 1 AND parent_id = 1 AND value = 'y'
Оконная функция обычно более эффективна, чем коррелированные подзапросы.
Демонстрация на БД Fiddle .
Запрос работает следующим образом.
Сначала он пересекает таблицу и использует ROW_NUMBER()
для назначения aa.ранжирование каждой записи в группе записей, имеющих одинаковый parent_id
и запись с наибольшим номером date
пронумерованным 1
.Вы можете запустить подзапрос, чтобы увидеть, что он на самом деле возвращает (он становится более интересным, когда существует более одного parent_id
):
SELECT t.*, ROW_NUMBER() OVER(PARTITION BY t.parent_id ORDER BY t.date DESC) rn
FROM mytable t
Затем все, что остается сделать, - это отфильтровать цель.parent_id
, выберите запись с номером строки 1 (т. Е. Запись, которая имеет наибольшее значение date
для этого parent_id
), и убедитесь, что она имеет value = 'y'
.