繁体   English   中英

SQL 当有多个具有最早日期的行时按最小日期分组

[英]SQL Group By Min Date When There Are Multiple Rows With Earliest Date

我正在尝试提出一个查询,该查询将返回客户最早下订单的聚合数据。 当给定客户的最早购买日期有多个行/订单时,是否可以这样做? 例如,我有这些表:

                                 customers
ID 姓名 created_at
1 山姆 2019-07-12
2 吉米 2019-01-22
                                   items
ID 姓名 价格
1 手表 200
2 腰带 75
3 钱包 150
                                  orders
ID 客户ID item_id created_at
1 1 1 2018-08-01
2 1 2 2018-08-11
3 2 1 2019-01-22
4 2 3 2019-01-22
5 2 2 2019-03-03
                             expected query
客户ID 姓名 first_purchase_date n_items 总价
1 山姆 2018-08-01 1 200
2 吉米 2019-01-22 2 350

我目前设置了以下查询,但此查询按 customer_id 分组,因此商品总数和总价格不反映最早的订单。

SELECT 
    orders.customer_id, 
    customers.name AS name, 
    MIN(orders.created_at) AS first_purchase_date,
    COUNT(*) as n_items,
    SUM(items.price) as total_price
FROM orders
INNER JOIN customers
    ON orders.customer_id = customers.id
INNER JOIN items
    ON orders.item_id = items.id
GROUP BY
    customers.id

         my incorrect query
客户ID 姓名 first_purchase_date n_items 总价
1 山姆 2018-08-01 2 275
2 吉米 2019-01-22 3 425

非常感谢任何帮助。 谢谢!

解释:

  • cte将为您提供每个客户 ID 和名称的 first_purchase_date
  • 使用该表查找与客户 ID 和 first_purchase_date 匹配的聚合

分贝<>小提琴

WITH cte AS (
SELECT 
    orders.customer_id, 
    customers.name, 
    MIN(orders.created_at) AS first_purchase_date
FROM orders
INNER JOIN customers
    ON orders.customer_id = customers.id
INNER JOIN items
    ON orders.item_id = items.id
GROUP BY
    orders.customer_id,
    customers.name
)

SELECT
    cte.customer_id,
    cte.name,
    cte.first_purchase_date,
    COUNT(orders.item_id) AS n_items,
    SUM(items.price) AS total_price
FROM cte
INNER JOIN orders 
    ON cte.customer_id = orders.customer_id
    AND cte.first_purchase_date = orders.created_at
INNER JOIN items
    ON orders.item_id = items.id
GROUP BY 
    cte.customer_id,
    cte.name,
    cte.first_purchase_date
;
select   customer_id
        ,name
        ,created_at as first_purchase_date
        ,count(*)   as n_items
        ,sum(price) as total_price
from    (
         select    o.customer_id
                  ,c.name
                  ,o.created_at
                  ,i.price
                 ,rank() over(partition by o.customer_id order by o.created_at) as rn
         from     orders o join items i on i.id = o.item_id join customers c on c.id = o.customer_id
        ) t
where    rn = 1
group by customer_id, name, created_at
客户ID 姓名 first_purchase_date n_items 总价
1 山姆 2018-08-01 00:00:00 1 200
2 吉米 2019-01-22 00:00:00 2 350

小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM