问题描述
我正在尝试使用窗口函数来解决this链接中的第12个问题,所需的输出是:
数据库的架构为:
为此,我首先使用以下代码创建了一个临时表:
select
distinct adddate(booking_date,nights) as vacate_day,floor(room_no/100) as floor,sum(1) over (partition by vacate_day,floor(room_no/100)) as count
from booking
where adddate(booking_date,nights) between '2016-11-14' and '2016-11-20'
order by vacate_day,room_no;
这给了我下面的结果表:
现在我要尝试的是-假设仅获取第一层的计数,在使用vacate_day进行分区并按地板进行排序之后,我使用了nth_value来获取计数的第一个值。我使用了以下代码:
select vacate_day,nth_value(count,1) over (partition by vacate_day order by floor) as 1st
from
(select
distinct adddate(booking_date,room_no) as temp;
这会出现以下错误
如果没有GROUP BY子句,则不具有GROUP列的GROUP列(MIN(),MAX(),COUNT(),...)的混合是非法的
我不明白为什么它要求我按by分组,因为据我所知,window函数使用分区对行进行分组。现在,可以说我按照vacate_day分组来解决此错误,但是当尝试使用以下代码获取2楼数量时,它将为所有行提供null
。我认为应该工作的最终代码如下:
select vacate_day,1) over (partition by vacate_day order by floor) as 1st,2) over (partition by vacate_day order by floor) as 2nd,3) over (partition by vacate_day order by floor) as 3rd
from
(select
distinct adddate(booking_date,room_no) as temp
group by vacate_day;
我从这段代码中得到的输出是:
PS:我想我这里缺少一些逻辑要点,而不是语法错误,我也有一个简单的解决方案,但我真正的问题是此实现我认为应该可行。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)