SQL 他们的第一个订单和第二个订单的购买价值之间的差异
Posted
技术标签:
【中文标题】SQL 他们的第一个订单和第二个订单的购买价值之间的差异【英文标题】:SQL Difference between the purchase value of their first order and the second order 【发布时间】:2021-11-23 22:28:50 【问题描述】:我需要帮助来获取客户第一订单和第二订单之间的不同购买价值。例如,我知道 customer_id 12345 在 2021 年 1 月 1 日购买了他们的第一个订单,他们在 2021 年 1 月 12 日购买了他们的下一个订单。我可以使用 MIN(Table1.date) 获得第一个订单,但不确定如何获得下一个订单日期。 请帮忙!非常感谢您的帮助!
我在下面有 2 个表格:
表 1: 描述 所有独特的结帐 - 每个结帐一行 customer_id 客户 ID cart_id 唯一的购物车 ID date 购物车结帐日期
表 2: 描述 所有购物车-商品组合——每一行都是购物车中的一个商品类型 cart_id 购物车 ID item 给定购物车中的项目 数量 购物车中的物品数量 price_per_unit_cents 购物车中单件商品的价格
【问题讨论】:
您可以使用与已有的类似的语法。免责声明:伪代码: SELECT MIN(Table1.Date) 获取您的第一个,然后将 Table1 加入或联合到另一个 Table1 并执行类似 SELECT MIN(Table1.Date) WHERE Table1.Date NOT IN (SELECT (MIN(Table1.日期))。那么这也会为您提供您正在寻找的下一个值。 我删除了冲突的 DBMS 标签。请为您真正使用的数据库产品添加一个标签。 请在您的问题中添加示例数据并获得预期结果;您的问题标题指的是差异,您的正文指的是不同的值。是哪个? 【参考方案1】:此解决方案主要是标准 SQL,适用于最新版本的 mysql、PostgreSQL 等。
有几种方法可以做到这一点。
这是一个简单聚合问题的组合,也是一个窗口函数问题,我们希望按日期引用每个客户/购物车的基本聚合结果中的相邻行。窗口函数 (LEAD
) 仅引用基于 PARTITION BY
和 ORDER BY
子句的下一个后续结果行。
这是一个简单的测试用例。它为所有客户生成所有行,每个行都有下一个购物车总数。请注意最后一行包含 null,因为没有 next
购物车总数。
它比您要求的要多一些,但包含一些有用的细节,说明如何轻松生成更复杂的结果。我们可以根据需要将其限制为特定客户和特定订单。
其中一些可以稍微简化,具体取决于约束和您的数据库如何处理功能依赖性。 如果cart_id是table1的主键,不仅仅是唯一的,我们可以再简化一点。
PG test case here
SELECT t1.cart_id
, t1.customer_id
, t1.date
, SUM(quantity * price_per_unit_cents)
, LEAD(SUM(quantity * price_per_unit_cents)) OVER (PARTITION BY t1.customer_id ORDER BY t1.date, t1.cart_id) AS next
, ROW_NUMBER() OVER (PARTITION BY t1.customer_id ORDER BY t1.date, t1.cart_id) AS n
FROM table1 AS t1
JOIN table2 AS t2
ON t1.cart_id = t2.cart_id
GROUP BY t1.customer_id, t1.cart_id
ORDER BY t1.customer_id, date
;
结果(用更多数据显示行为):
设置:
CREATE TABLE table1 (
customer_id int -- Customer id
, cart_id int primary key -- cart id
, date Date -- of the cart checkout
);
CREATE TABLE table2 (
cart_id int -- cart id
, item int -- Item in a given cart
, quantity int -- Quantity of item in a cart
, price_per_unit_cents decimal(7,2) -- Price per single unit of item in a cart
);
INSERT INTO table2 VALUES
(1, 1, 5, 100.00)
, (1, 2, 8, 50.00)
, (2, 1, 5, 110.00)
, (2, 2, 7, 60.00)
, (3, 1, 5, 300.00)
, (3, 2, 8, 50.00)
, (4, 1, 5, 310.00)
, (4, 2, 7, 60.00)
, (5, 1, 2, 110.00)
, (5, 2, 3, 60.00)
;
INSERT INTO table1 VALUES
(1, 1, current_date)
, (1, 2, current_date + INTERVAL '1' DAY)
, (2, 3, current_date)
, (2, 4, current_date + INTERVAL '2' DAY)
, (1, 5, current_date + INTERVAL '3' DAY)
;
【讨论】:
以上是关于SQL 他们的第一个订单和第二个订单的购买价值之间的差异的主要内容,如果未能解决你的问题,请参考以下文章
如何返回第一个订单价值>第二个订单价值的customer_id? [关闭]