我有一个包含三个表的Postgres 9.1数据库 - Customer,Invoice和Line_Items
我想创建一个客户列表,显示具有特定项目的任何客户的客户和上次发票日期(特别是所有发票,其中line_items.code以“L3”开头)。
首先,我试图为每个客户提取一笔交易(带有“L3”代码的最后一张发票)(计算一旦创建此列表,我就可以加入客户名称。)
表格是这样的:
客户
cust_number last_name first_name
=========== ======== ====================
1 Smith John
2 Jones Paul
3 Jackson Mary
4 Brown Phil
交易
trans_number date cust_number
=========== =========== ====================
1001 2014-01-01 1
1002 2014-02-01 4
1003 2014-03-02 2
1004 2014-03-06 3
Line_Items
trans_number date item_code
=========== =========== ====================
1001 2014-01-01 L3000
1001 2014-01-01 M2420
1001 2014-01-01 L3500
1002 2014-02-01 M2420
1003 2014-03-02 M2420
1004 2014-03-06 L3000
到目前为止,我有:
Select transactions.cust_number, transactions.trans_number
from transactions
where transactions.trans_number in
( SELECT Line_Items.trans_number
FROM Line_Items
WHERE Line_Items.item_code ilike 'L3%'
ORDER BY line_items.date DESC
)
order by transactions.pt_number
这会在发票上以“L3”代码为每个客户提取所有发票,但我无法弄清楚如何获得最后一张发票。
答案 0 :(得分:3)
使用DISTINCT ON
:
SELECT DISTINCT ON (t.cust_number)
t.cust_number, t.trans_number
FROM line_items l
JOIN transactions t USING (trans_number)
WHERE l.item_code ILIKE 'L3%'
ORDER BY t.cust_number, l.date DESC;
每cust_number
最多返回一行 - 最新 trans_number
。您可以自由地在SELECT
列表中添加更多列。
详细说明:
答案 1 :(得分:0)
你可以使用MIN或MAX:
SELECT Line_Items.trans_number, Max(line_items.date) As [last]
From Line_Items
Group By Line_Items.trans_number