提问人:BenS 提问时间:8/30/2023 更新时间:8/30/2023 访问量:40
在 having 子句中使用 MIN() 时遇到问题
Having trouble using MIN() in having clause
问:
尝试为每个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)
答:
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 ASC
ORDER 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 的原因,但请注意,在不同的查询运行中,可能会出现不同的结果。
评论