使用Postgres的最后发票

时间:2014-11-05 18:05:25

标签: sql postgresql greatest-n-per-group

我有一个包含三个表的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”代码为每个客户提取所有发票,但我无法弄清楚如何获得最后一张发票。

2 个答案:

答案 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