SQL:SELECT 行的最大创建日期 table
SQL: SELECT rows with max date from created table
我想知道如何创建一个 returns SERIALID、QTY,但仅针对最后一个 INVOICEDATE 的查询。
为了合并来自两个 table 的信息,我使用 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
我有两个 table 结合 UNION 和我的 table 外观:
我想查询 returns SERIALID,QTY,但只针对最后一个 INVOICEDDATE。
我想得到的结果:
提前致谢!
如果您的 RDBMS 支持 ROW_NUMBER()
,您可以使用 ROW_NUMBER() PARTITION BY
实现此目的,如下所示。
SELECT *
FROM (
SELECT *
,ROW_NUMBER() OVER (
PARTITION BY SERIALID ORDER BY INVOICEDATE DESC
) RN
FROM SERVICETRANS
) T
WHERE RN = 1
上面的查询将为每个 SERIALID
的最大 INVOICEDATE
的每个 return 你 1 条记录
同样可以在没有 ROW_NUMBER()
的情况下完成,如下所示。
SELECT *
FROM SERVICETRANS ST
WHERE INVOICEDATE = (
SELECT MAX(INVOICEDATE)
FROM SERVICETRANS STI
WHERE STI.SERIALID = ST.SERIALID
)
注意:上面的查询可能return一个SERIALID
多行,如果MAX(INVOICEDATE)
对于相同SERIALID
.
许多数据库支持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;
注意,如果同一天有两张发票,这里任意returns其中一张。如果两者都需要,请使用 RANK()
。
请注意,这里使用 UNION ALL
,而不是 UNION
。 UNION
会产生删除重复项的开销。这对于这样的查询似乎没有用。
根据您的数据库(和数据),可能有其他表达此查询的方法,有些可能具有更好的性能特征。
我想知道如何创建一个 returns SERIALID、QTY,但仅针对最后一个 INVOICEDATE 的查询。
为了合并来自两个 table 的信息,我使用 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
我有两个 table 结合 UNION 和我的 table 外观:
我想查询 returns SERIALID,QTY,但只针对最后一个 INVOICEDDATE。
我想得到的结果:
提前致谢!
如果您的 RDBMS 支持 ROW_NUMBER()
,您可以使用 ROW_NUMBER() PARTITION BY
实现此目的,如下所示。
SELECT *
FROM (
SELECT *
,ROW_NUMBER() OVER (
PARTITION BY SERIALID ORDER BY INVOICEDATE DESC
) RN
FROM SERVICETRANS
) T
WHERE RN = 1
上面的查询将为每个 SERIALID
的最大 INVOICEDATE
同样可以在没有 ROW_NUMBER()
的情况下完成,如下所示。
SELECT *
FROM SERVICETRANS ST
WHERE INVOICEDATE = (
SELECT MAX(INVOICEDATE)
FROM SERVICETRANS STI
WHERE STI.SERIALID = ST.SERIALID
)
注意:上面的查询可能return一个SERIALID
多行,如果MAX(INVOICEDATE)
对于相同SERIALID
.
许多数据库支持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;
注意,如果同一天有两张发票,这里任意returns其中一张。如果两者都需要,请使用 RANK()
。
请注意,这里使用 UNION ALL
,而不是 UNION
。 UNION
会产生删除重复项的开销。这对于这样的查询似乎没有用。
根据您的数据库(和数据),可能有其他表达此查询的方法,有些可能具有更好的性能特征。