尝试为每个 customer_id 选择最早的 order_date。 使用以下查询
SELECT customer_id, order_date
FROM Delivery
GROUP BY customer_id
HAVING MIN(order_date) = order_date
但是那些具有多个 order_date 行的 customer_id 不会显示在结果中。例如 id = 7 的 order_date 为“2019-07-22”和“2019-07-08”。运行上面的查询,id = 7 没有显示在结果中。想知道是什么原因导致这样的问题以及如何解决它?
我知道我可以使用子查询和 where 子句。我真的很想知道having 子句出了什么问题。
WHERE (customer_id, order_date) IN (SELECT customer_id, MIN(order_date)
FROM Delivery
GROUP BY customer_id)
对于 SQL SERVER,尝试使用 ROW_NUMBER
declare @delivery table (customer_id int, order_date date)
insert into @delivery values (1, '1-jan-2023')
, (1, '2-jan-2023')
, (1, '3-jan-2023')
, (2, '2-jan-2023')
, (2, '3-jan-2023')
declare @targetOrderDate date = '2-Jan-2023'
select
a.customer_id
,a.order_date
from (
select
ROW_NUMBER() OVER(PARTITION BY customer_id ORDER BY order_date ASC) r_num
,a.customer_id
,a.order_date
from @delivery a
) AS a
WHERE a.r_num = 1
and a.order_date = @targetOrderDate
要列出客户的第一笔订单,您可以评论
and a.order_date = @targetOrderDate
。
要列出客户最后的订单,您可以将
ORDER BY order_date ASC
更改为 ORDER BY order_date DESC
MIN(order_date)
函数确实返回每个 customer_id 组的最小 order_date,但 HAVING 子句中的 order_date
只是每个组中任意行的 order_date ,不一定是具有最小 order_date 的行。