sql - 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
请指教,谢谢
解决方案
您可以使用窗口函数:
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;
推荐阅读
- javascript - 为什么浏览器不断抛出无法获取消息?
- javascript - 如何使用 Puppeteer 获取跨度文本值
- php - wordpress 无法连接到 mysql
- c# - 如何向我的项目添加确认电子邮件和短信?
- javascript - 更新后如何返回JS对象值
- python - 带有 mod_wsgi 的 Django 3.0.5:AttributeError:“HttpResponse”对象没有属性“_resource_closers”
- vichuploaderbundle - '传递给 Symfony\Bridge\Twig\Extension\TranslationExtension::trans() 的参数 1 必须是字符串类型,给定空值'
- c# - 将表示神经网络的锯齿状数组转换为表示其神经通路 C# 的二维数组
- r - 我如何将格鲁吉亚彩票中的最后 10 次基诺抽奖刮到 R 中?
- javascript - 开玩笑 - 检查项目是否不包含具有某些属性的对象