sql - 如果产品是较早订购的
问题描述
桌子 :
order_date. order_id. customer_id. product id
2020-01-01 O1. C1. P1
2020-01-01 O1. C1. P2
2020-01-01 O1. C1. P3
2020-01-10 O2. C1. P2
2020-01-10 O2. C1. P3
2020-01-10 O2. C1. P4
2020-01-10 O2. C1. P5
我使用了如下代码,但是对于大量数据(比如 10M 行),它会超时。有没有更好的方法来提高这个查询的性能?
select a.order_date, a.customer_id, a.order_id, a.product_id, case when b.product_id = a.product_id then 'Y' else 'N' end as prev_purchase_sts
from table a
left join table b on a.customer_id = b.customer_id and a.order_date > b.order_date
解决方案
如果您想检查客户之前是否订购过相同的产品,请使用EXISTS
:
SELECT a.*,
CASE
WHEN EXISTS (
SELECT 1
FROM table b
WHERE a.customer_id = b.customer_id AND a.product_id = b.product_id AND a.order_date > b.order_date
) THEN 'Y'
ELSE 'N'
END AS prev_purchase_sts
FROM table a;
或者,LAG()
窗口函数:
SELECT *,
CASE
WHEN LAG(order_date) OVER (PARTITION BY customer_id, product_id ORDER BY order_date) IS NOT NULL THEN 'Y'
ELSE 'N'
END AS prev_purchase_sts
FROM table;
或者,ROW_NUMBER()
窗口函数:
SELECT *,
CASE
WHEN ROW_NUMBER() OVER (PARTITION BY customer_id, product_id ORDER BY order_date) > 1 THEN 'Y'
ELSE 'N'
END AS prev_purchase_sts
FROM table;
推荐阅读
- python - 如何在 matplotlib 绘图函数中将 'ந ே' 打印为 'நே'?渲染问题
- ag-grid - 如何为 ag-grid 行编辑实现验证规则
- android - 是否有任何 NodeJs 库来验证 apk 文件的 Android V2 签名?
- mysql - 使用 ORM 时如何确保域完整性
- javascript - 根据用户交互更改 react-transition-group 退出动画?
- vb.net - 尝试循环创建多个对象,然后将三个文本框值从 winform 分配给每个对象
- javascript - 带有复选框的 Javascript 事件(选中、未选中)
- apostrophe-cms - 如何对小部件列表进行排序?
- c# - System.Drawing.Icon 路径
- android - 从 Android 应用程序插入行时 MySQL 服务器异常