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。
我想运行一份过去两年内订购过的任何客户的销售报告。
我可以 运行 一份两年内所有发票的报告,然后删除 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。