Если вы используете Sqlite 3.25 или новее, это легко сделать с помощью оконных функций:
SELECT job_id, po_id, po_date, vendor_id
FROM (SELECT *, rank() OVER (PARTITION BY vendor_id ORDER BY po_date) AS rn FROM pos)
WHERE rn = 1
ORDER BY vendor_id;
По сути, это разбивает все строки таблицы на vendor_id
(очень похоже на концепцию GROUP BY, за исключением того, что применяется ко всем строкам результата, а не при генерации строк результата) и сортирует каждый раздел по po_date
, а затем нумерует их в соответствии с их ранжированием - все заказы на поставку на самую раннюю дату для каждого поставщика будут иметь ранг 1. Тогда внешний запрос выбирает только эти строки ранга 1.
Для достижения наилучших результатов используйте индекс pos(vendor_id, po_date)
.
Подход не оконной функции, который не использует GROUP BY
или JOIN
в соответствии с требованиями OP. Этот действительно нуждается в вышеупомянутом индексе, чтобы минимизировать полное сканирование таблицы.
SELECT job_id, po_id, po_date, vendor_id
FROM pos AS p1
WHERE po_date = (SELECT min(p2.po_date) FROM pos AS p2 WHERE p1.vendor_id = p2.vendor_id)
ORDER BY vendor_id;
Сравните это с вопросом в вашем вопросе; вы просто упустили возможность ограничить подзапрос текущей строкой vendor_id
и сравнением правильной даты.