我有两个表,分别是表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
答案 0 :(得分:1)
假设两个表之间的连接条件是b.id
与a.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