首页 > 解决方案 > SQL中多行相同日期的上一个日期

问题描述

我尝试获取客户 ID 的上一个日期。

问题是每个客户 ID 在同一日期都有多行与他们购买的商品有关。

我的数据集中需要这些行。

我尝试了以下操作,但这给了我一行的前一个日期,而其他行被忽略:

LAG([date], 1, NULL) OVER (PARTITION BY [shop_id], [customer_id] ORDER BY [date] ASC) AS [previous_date]

这是示例数据,我需要“上一个日期”列:

shop_id    date      customer ID   items     previous date
------------------------------------------------------------
1111      2020/1/1        aaa       milk        NULL
1111      2020/1/1        aaa       cheese      NULL
1111      2020/1/1        aaa       bread       NULL
1111      2020/2/5        aaa       apple       2020/1/1
1111      2020/2/5        aaa       cherry      2020/1/1

请指教,谢谢

标签: sql

解决方案


您可以使用窗口函数:

select t.*, 
       max(date) over (partition by shop_id order by date range between unbounded preceding and interval '1 day' preceding) as previous_date
from t;

以上是标准SQL。您问题中代码片段的语法建议使用 SQL Server。如果是这样,最简单的方法可能是横向连接:

select t.*, t2.date
from t outer apply 
     (select max(t2.date)
      from t t2
      where t2.shop_id = t.shop_id and t2.date < t.date
     ) t2;

推荐阅读