FirebirdSQL Unique & Max(或 MaxValue)

FirebirdSQL Unique & Max (or MaxValue)

我想运行一份过去两年内订购过的任何客户的销售报告。

我可以 运行 一份两年内所有发票的报告,然后删除 excel 中的重复项,但我宁愿直接在 (Firebird) SQL[=15 中进行=]

我可以使用 WHERE date < 1 Jan 2015(2 年或更长),但如何让它只向客户展示一次?我想如果我使用 MAX(Date) 因此显示那两年期间的最近日期。我哪里错了?我相信我需要在 SELECT 子句中使用像 UNIQUE(ORDERCUSTOMER) 这样的 UNIQUE() 函数。

SELECT
FINANCIALSALESINVOICES.TRANSACTIONDATE,
FINANCIALSALESINVOICES.INVOICECUSTOMER, 
FINANCIALSALESINVOICES.ORDERCUSTOMER,
FINANCIALSALESINVOICES.INVOICENUMBER,
FINANCIALSALESINVOICES.SOURCENUMBER,
MAX(FINANCIALSALESINVOICES.TRANSACTIONDATE)

FROM FINANCIALSALESINVOICES 
WHERE (FINANCIALSALESINVOICES.TRANSACTIONDATE>={d '2015-01-01'})
ORDER BY FINANCIALSALESINVOICES.INVOICECUSTOMER, FINANCIALSALESINVOICES.TRANSACTIONDATE

我确实让它显示了过去两年中每个发票实例的最大日期,但现在无法修改或复制该文件。

一种方法是在 WHERE 子句中使用子查询来检查最近的发票:

SELECT
    t.TRANSACTIONDATE,
    t.INVOICECUSTOMER, 
    t.ORDERCUSTOMER,
    t.INVOICENUMBER,
    t.SOURCENUMBER
FROM FINANCIALSALESINVOICES t
WHERE t.TRANSACTIONDATE >= date '2015-01-01' AND
      t.TRANSACTIONDATE = (SELECT MAX(f.TRANSACTIONDATE)
                           FROM FINANCIALSALESINVOICES f
                           WHERE t.ORDERCUSTOMER = f.ORDERCUSTOMER AND
                                 f.TRANSACTIONDATE >= date '2015-01-01')
ORDER BY t.INVOICECUSTOMER,
         t.TRANSACTIONDATE

使用 Firebird 3,您可以使用 row_number() 为组(分区)中的每一行分配一个唯一值,然后可以过滤该值:

select 
    a.TRANSACTIONDATE,
    a.INVOICECUSTOMER, 
    a.ORDERCUSTOMER,
    a.INVOICENUMBER,
    a.SOURCENUMBER
from (
    select
        TRANSACTIONDATE,
        INVOICECUSTOMER, 
        ORDERCUSTOMER,
        INVOICENUMBER,
        SOURCENUMBER,
        row_number() over (partition by INVOICECUSTOMER, order by TRANSACTIONDATE desc) as rownr
    from FINANCIALSALESINVOICES
    where TRANSACTIONDATE >= date '2015-01-01'
) a
where a.rownr = 1
order by a.INVOICECUSTOMER, a.TRANSACTIONDATE

另请参阅 Firebird 3 发行说明中的​​ Window (Analytical) Functions