如何将每个分组并按最大顺序

时间:2018-07-30 13:47:48

标签: oracle

我有两个表,分别是表a和b,

id      customer_code     invoice_id
uuid1        c1                 5
uuid2        c2                 2
uuid3        c3                 3
uuid4        c2                 6
uuid5        c1                 4
uuid6        c2                 1

表b

id      invoice_no        create_date           
1       i001        2018-07-01  10:00:00         
6       i002        2018-07-05  15:00:00         
5       i003        2018-07-03  15:00:00         
4       i004        2018-07-11  15:00:00         
2       i005        2018-07-04  15:00:00         
3       i006        2018-07-06  15:00:00         

它获得每个客户的订单。每个客户只能按日期升序获得最大日期和订单。

结果:

customer_code        create_date
c2              2018-07-05  15:00:00
c3              2018-07-06  15:00:00
c1              2018-07-11  15:00:00

我想要得到如下的最终结果。它必须与结果的顺序相同,如何编写SQL?

最终结果

customer_code  
c2              
c3            
c1

1 个答案:

答案 0 :(得分:1)

假设两个表之间的连接条件是b.ida.invoice_id匹配,那么这是一个简单的聚合连接:

select a.customer_code, max(b.create_date)
from a
join b on b.id = a.invoice_id
group by a.customer_code;

CUSTOMER_CODE CREATE_DATE        
------------- -------------------
c3            2018-07-06 15:00:00
c1            2018-07-11 15:00:00
c2            2018-07-05 15:00:00

具有不确定的顺序;因此,您需要一个order-by子句,该子句可以与order by 2一起使用位置符号,或者在给出最终目标的情况下更有用,可以重复聚合表达式:

select a.customer_code, max(b.create_date) as create_date
from a
join b on b.id = a.invoice_id
group by a.customer_code
order by max(b.create_date);

CUSTOMER_CODE CREATE_DATE        
------------- -------------------
c2            2018-07-05 15:00:00
c3            2018-07-06 15:00:00
c1            2018-07-11 15:00:00

您可以按不在选择列表中的表达式进行排序-只要在该列表中是有效的,就可以对分组依据中的聚合或列进行排序-因此您可以从选择中省略日期聚合如果您只想查看客户代码,请列出:

select a.customer_code
from a
join b on b.id = a.invoice_id
group by a.customer_code
order by max(b.create_date);

CUSTOMER_CODE
-------------
c2
c3
c1