Oracle SQL如何计算当前订单与上一笔订单之间的间隔天数
计算当前订单与上一笔订单的间隔天数
嘿,别担心,这个需求用SQL的窗口函数就能轻松实现!从你的表名oe.orders和日期格式来看,你应该用的是Oracle数据库,正好Oracle的LAG()窗口函数完美适配这个场景。
核心思路
LAG()函数可以帮你获取同一排序规则下上一行的指定字段值——在这里,我们可以用它拿到上一笔订单的日期,然后用当前订单日期减去这个日期,就能得到间隔天数了。
完整SQL代码
SELECT order_id, order_date, -- 截断时分秒部分,计算整数间隔天数 TRUNC(order_date) - TRUNC(LAG(order_date) OVER (ORDER BY order_date)) AS days_since_last_order FROM oe.orders WHERE customer_id = 838 ORDER BY order_date DESC;
代码细节解释
LAG(order_date) OVER (ORDER BY order_date):按订单日期升序排序后,为每一行返回上一行的order_date值。最新的订单(结果第一行)没有上一笔订单,所以这个值会是NULL。TRUNC(order_date):因为你的日期包含时分秒,直接相减会得到带小数的天数(比如间隔2天3小时会显示2.125)。用TRUNC()截断时间部分,只保留纯日期,这样相减得到的就是整数天数。- 处理NULL值(可选):如果希望最新订单的间隔天数显示为0而不是
NULL,可以用NVL()函数替换:
NVL(TRUNC(order_date) - TRUNC(LAG(order_date) OVER (ORDER BY order_date)), 0) AS days_since_last_order
针对你样本数据的示例结果
| order_id | order_date | days_since_last_order |
|---|---|---|
| 1920 | 25-MAR-19 15.45.38.000000000 | NULL |
| 1618 | 08-FEB-19 12.51.39.000000000 | 45 |
| 1592 | 04-FEB-19 07.35.46.000000000 | 4 |
(注:25-MAR-19减去08-FEB-19是45天,08-FEB-19减去04-FEB-19是4天)
内容的提问来源于stack exchange,提问作者katarzynat




