编写SQL查询:展示各order_id对应的同一客户下一笔订单ID
获取同一客户的下一笔订单ID的SQL实现
嗨,这个需求刚好是窗口函数的典型应用场景,用LEAD()函数就能完美解决,它专门用来抓取同一分组内的下一行数据。
直接可用的SQL查询
SELECT order_id, LEAD(order_id) OVER ( PARTITION BY customer_id ORDER BY order_date ASC ) AS next_order_id FROM orders;
逐部分解释下这个语句
LEAD(order_id):这部分的作用是,在当前行所在的分组里,获取下一行的order_id值。如果当前行是该客户的最后一笔订单,这个字段就会返回NULL——毕竟没有下一笔订单了嘛。PARTITION BY customer_id:把整个数据集按客户ID拆分成分组,这样我们只会在同一个客户的订单里找下一笔,不会跨客户乱匹配。ORDER BY order_date ASC:在每个客户的分组里,按订单日期从小到大排序,确保我们拿到的是时间上真正的下一笔订单,而不是随便哪个后续的订单ID。
用你的示例数据测试下
你给的示例输入是:
| order_id | Customer_id | Order_date |
|---|---|---|
| 1 | 1 | 2017-11-01 |
| 2 | 2 | 2017-11-02 |
| 3 | 1 | 2017-11-03 |
| 4 | 2 | 2017-11-04 |
执行上面的查询后,会得到这样的结果:
| order_id | next_order_id |
|---|---|
| 1 | 3 |
| 3 | NULL |
| 2 | 4 |
| 4 | NULL |
如果想要输出结果和你给的示例一样按order_id排序(而不是按分组后的顺序),可以套一层子查询再排序:
SELECT order_id, next_order_id FROM ( SELECT order_id, LEAD(order_id) OVER ( PARTITION BY customer_id ORDER BY order_date ASC ) AS next_order_id FROM orders ) AS ordered_orders ORDER BY order_id ASC;
这样输出就会严格按order_id从小到大排列啦。
内容的提问来源于stack exchange,提问作者Abhishek Gupta
相关产品推荐
相关产品推荐

