select customer_id, min(order_date) as first_date, customer_pref_delivery_date
from Delivery
group by customer_id
ORDER BY customer_id;
这是输入表
Delivery
:
送货_id | 客户 ID | 订单_日期 | 客户偏好_交货_日期 |
---|---|---|---|
1 | 1 | 2019-08-01 | 2019-08-02 |
2 | 2 | 2019-08-02 | 2019-08-02 |
3 | 1 | 2019-08-11 | 2019-08-12 |
4 | 3 | 2019-08-24 | 2019-08-24 |
5 | 3 | 2019-08-21 | 2019-08-22 |
6 | 2 | 2019-08-11 | 2019-08-13 |
7 | 4 | 2019-08-09 | 2019-08-09 |
这是我的结果:
客户 ID | 第一个日期 | 客户偏好_交货_日期 |
---|---|---|
1 | 2019-08-01 | 2019-08-02 |
2 | 2019-08-02 | 2019-08-02 |
3 | 2019-08-21 | 2019-08-24 |
4 | 2019-08-09 | 2019-08-09 |
这是预期结果:
客户 ID | 第一个日期 | 客户偏好_交货_日期 |
---|---|---|
1 | 2019-08-01 | 2019-08-02 |
2 | 2019-08-02 | 2019-08-02 |
3 | 2019-08-21 | 2019-08-22 |
4 | 2019-08-09 | 2019-08-09 |
您能帮我解释一下,当 order_date 为 2019-08-24 时,为什么客户 3 的 customer_pref_delivery_date 位于不同的行中?即使我将其设置为 min(order_date) 并且我认为 SQL 会从同一行返回 customer_pref_delivery_date 。为什么不是这种情况以及如何解决这个问题?
非常感谢!
见上文!非常感谢!
一种选择是使用
CTE
获取每个 customer_id 的 MIN(order_date)
,然后使用外部查询添加其他列:
WITH minData AS
(SELECT customer_id, MIN(order_date) AS order_date
FROM Delivery
GROUP BY customer_id)
SELECT
customer_id,
order_date AS first_date,
customer_pref_delivery_date
FROM Delivery
WHERE
(customer_id, order_date) IN
(SELECT customer_id, order_date FROM minData);
IN
子句(您也可以使用INNER JOIN
代替)确保仅获取相关行。
这是一个基于您的数据的样本小提琴。