[英]How to group rows in SQL by earliest date when are there are multiple rows with earliest date?
[英]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_dateWITH 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.