min(count(*))超过...行为?

时间:2019-01-06 15:11:51

标签: sql-server

我正试图了解

的行为
select ..... ,MIN(count(*))   over (partition by hotelid)

VS

select ..... ,count(*)   over (partition by hotelid)

好的。

我有饭店列表(1,2,3)
每个酒店都有部门。
每个部门都有工人。

我的数据如下:

select   *    from data

enter image description here

好的。查看此查询:

select   hotelid,departmentid  , cnt= count(*)   over (partition by hotelid)
from data
group by hotelid, departmentid
ORDER BY hotelid

enter image description here

我完全可以理解这里发生的事情。在该结果集上,按hotelId进行分区,我们计数可见行。

但是看看这个查询会发生什么:

select   hotelid,departmentid  ,  min_cnt = min(count(*))   over (partition by hotelid)   
from data
group by hotelid, departmentid
ORDER BY hotelid

enter image description here

问题: 这些数字从哪里来?我不知道添加min是如何导致该结果的? min是什么? 有人可以解释一下如何进行计算吗?

fiddle

1 个答案:

答案 0 :(得分:4)

这两个语句有很大不同。第一个查询是对分组后的行进行计数,然后应用PARTITION。因此,例如,对于旅馆1,返回了1行(因为旅馆1的所有行都具有相同的部门A),因此COUNT(*) OVER (PARTITION BY hotelid)返回1 。酒店2有两个部门'B''C',因此返回2。

对于第二个查询,首先具有COUNT(*),它不在OVER子句中。这意味着它将对查询GROUP BY中指定的GROUP BY hotelid, departmentid中的所有行进行计数。对于酒店1,部门A有4行,因此是4。然后您最少要花4;这不足为奇。4.对于所有其他酒店,它们至少有1个条目,而酒店和部门只有1行,因此返回1。