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

Having trouble using MIN() in having clause

提问人:BenS 提问时间:8/30/2023 更新时间:8/30/2023 访问量:40

问:

尝试为每个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的 分组依据 分钟 拥有

评论


答:

1赞 Aan Dahliansyah 8/30/2023 #1

对于 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 ASCORDER BY order_date DESC

1赞 Adrian Maxwell 8/30/2023 #2

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

即,在您的查询中,HAVING 子句排除了 GROUP BY 子句选择的任意行的order_date不是组中最小order_date的任何组。(这就是为什么结果中没有customer_id 7 的原因,但请注意,在不同的查询运行中,可能会出现不同的结果。