Многие базы данных поддерживают LEAST()
/ GREATEST()
. Возможно, самый эффективный метод, предполагающий отсутствие дубликатов:
WITH i AS (
SELECT sat.INVOICEDATE, sat.SERIALID, sat.QTY
FROM SALESTRANS sat
UNION ALL
SELECT set.INVOICEDATE, set.SERIALID, set.QTY
FROM SERVICETRANS sat
)
SELECT i.*
FROM (SELECT i.*,
ROW_NUMBER() OVER (PARTITION BY SERIALID ORDER BY INVOICEDATE DESC) as seqnum
FROM i
) i
WHERE seqnum = 1;
Обратите внимание, что если в одну и ту же дату есть два счета, это произвольно возвращает один из них. Используйте RANK()
, если хотите оба.
Обратите внимание, что здесь используется UNION ALL
, а не UNION
. UNION
накладные расходы на удаление дубликатов. Это не кажется полезным для такого запроса.
В зависимости от вашей базы данных (и данных), возможно, существуют альтернативные способы выражения этого запроса, некоторые могут иметь более высокие характеристики производительности.