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 BYORDER 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 他们的第一个订单和第二个订单的购买价值之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

使用AGGREGATE函数过滤掉$ 0的所有订单

如何返回第一个订单价值>第二个订单价值的customer_id? [关闭]

将 date_diff 以天数除以 365 以获得年数

查找两个最近订单之间的时差

SQL:我如何按顺序列出所有前2个订单的客户ID:第一个订单是帽子,第二个订单是太阳镜? [关闭]

SQL Regex 在第二个和第三个正斜杠之间选择字符串