我正试图了解
的行为select ..... ,MIN(count(*)) over (partition by hotelid)
VS
select ..... ,count(*) over (partition by hotelid)
好的。
我有饭店列表(1,2,3)
每个酒店都有部门。
每个部门都有工人。
我的数据如下:
select * from data
好的。查看此查询:
select hotelid,departmentid , cnt= count(*) over (partition by hotelid)
from data
group by hotelid, departmentid
ORDER BY hotelid
我完全可以理解这里发生的事情。在该结果集上,按hotelId
进行分区,我们计数可见行。
但是看看这个查询会发生什么:
select hotelid,departmentid , min_cnt = min(count(*)) over (partition by hotelid)
from data
group by hotelid, departmentid
ORDER BY hotelid
问题:
这些数字从哪里来?我不知道添加min
是如何导致该结果的? min
是什么?
有人可以解释一下如何进行计算吗?
答案 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。