在having子句中使用MIN()时遇到问题

问题描述 投票:0回答:2

尝试为每个 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 mysql group-by min having
2个回答
0
投票

对于 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


0
投票

MIN(order_date)
函数确实返回每个 customer_id 组的最小 order_date,但 HAVING 子句中的
order_date
只是每个组中任意行的 order_date ,不一定是具有最小 order_date 的行。

© www.soinside.com 2019 - 2024. All rights reserved.