I´m wondering how to create a query that returns SERIALID, QTY, but only for the last INVOICEDATE.
To combine information from two tables I use UNION.
SELECT ab.SERIALID, ab.QTY, ab.INVOICEDATE
FROM (SELECT a.INVOICEDATE, a.SERIALID, a.QTY
FROM SALESTRANS a
UNION
SELECT b.INVOICEDATE, b.SERIALID, b.QTY
FROM SERVICETRANS b
) ab
I have two tables combined with UNION and my table looks:
I would like to make a query that returns SERIALID, QTY, but only for the last INVOICEDDATE.
The result I would like to get:
Thanks in advance!
Many databases support LEAST()
/GREATEST()
. Perhaps the most efficient method assuming there are no duplicates is:
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;
Note that if there are two invoices on the same date, this arbitrarily returns one of them. Use RANK()
if you want both.
Note that this uses UNION ALL
, not UNION
. UNION
incurs overhead for removing duplicates. That does not seem useful for a query like this.
Depending on your database (and data), there are possibly alternative ways of expressing this query, some might have better performance characteristics.