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,而不是 UNIONUNION 会产生删除重复项的开销。这对于这样的查询似乎没有用。

根据您的数据库(和数据),可能有其他表达此查询的方法,有些可能具有更好的性能特征。