国家 | 商店_ID | 订单_日期 |
---|---|---|
德 | 990003975 | 2023-01-24 |
FR | 990004963 | 2023-04-11 |
FR | 990005204 | 2023-06-15 |
FR | 990005204 | 2023-06-10 |
FR | 990005204 | 2023-06-07 |
JP | 990005210 | 2023-01-08 |
我的数据如上表所示。 我需要一种方法来添加一列,显示同一 STORE_ID 的日期之间的天数差异,按 DESC 顺序对它们进行排序,我需要顶部日期和前一个日期之间的差异。对同一 STORE_ID 的其他日期(如果存在)重复此操作。 如果没有更多日期或只有 1 个日期,则输入 0。 因此,对于这个例子,我需要得到这样的东西:
国家 | 商店_ID | 订单_日期 | 天数 |
---|---|---|---|
德 | 990003975 | 2023-01-24 | 0 |
FR | 990004963 | 2023-04-11 | 0 |
FR | 990005204 | 2023-06-15 | 5 |
FR | 990005204 | 2023-06-10 | 3 |
FR | 990005204 | 2023-06-07 | 0 |
JP | 990005210 | 2023-01-08 | 0 |
我尝试了在另一个问题中看到的类似方法,但不确定为什么它对我不起作用(我在新列中得到空值)
SELECT country,
store_id,
order_date,
NextDate,
DATEDIFF(day, order_date, NextDate)
FROM ( SELECT country,
store_id,
order_date,
( SELECT MIN(order_date)
FROM main T2
WHERE T2.store_id = T1.store_id
AND T2.country > T1.country
AND T2.order_date > T1.order_date
) AS NextDate
FROM main T1
) AS T
order by 2,3
所以我在 LAG 上切换到 LEAD,并且你对时间递减的描述,改变了“其他想要的值”的关系:
with data(country, store_id, order_date) as (
select * from values
('DE', 990003975, '2023-01-24'::date),
('FR', 990004963, '2023-04-11'::date),
('FR', 990005204, '2023-06-15'::date),
('FR', 990005204, '2023-06-10'::date),
('FR', 990005204, '2023-06-07'::date),
('JP', 990005210, '2023-01-08'::date)
)
select
*
,lead(order_date,1,order_date) over (partition by store_id order by order_date desc) as lead_order_date
,datediff('days', lead_order_date, order_date) as days
from data
order by 2,3 desc;
给出:
可以压缩为:
select
*
,datediff(
'days',
lead(order_date,1,order_date) over (partition by store_id order by order_date desc),
order_date
) as days
from data
order by 2,3 desc;
给出更清晰的答案: