我们的数据库中有很少的餐馆(比如A),它在多个插槽(比如2个)插槽中打开:
我想根据当前时间打开餐厅时选择正确的插槽。例如,如果当前时间是06:15 PM,则查询应返回插槽2,如果当前时间是09:00 AM,则应返回插槽1,如果是10:00 PM,则应返回插槽1。因此,下一个合适的时段应该到来。
餐馆的时间存储在dish_timings_delivery
表中,其列如图所示:
我的问题:
SELECT * from (
SELECT *,row_number() over (partition by id ) as x from (
SELECT id,day,start_time,end_time,slot from dish_timings_delivery where id in
(101999001247,101999001225,10199900100,101999001223) order by case
when current_time + interval '5 hours 30 minutes' <= end_time then 1
else 2
end
) as foo ) as pp where x < 2
问题在于,对于一个dish_id
(比如101999001247
)查询返回正确的结果,但对于多个dish_ids
(比如101999001247, 101999001225, 10199900100, 101999001223
),如上所述查询结果不对。对于一些餐馆,插槽出了问题。
错误的意思是:
注意:current_time的值 - 间隔&#39; 1小时30分钟&#39;在发布时是12:26:34。
它应该给插槽1,但为某些菜ID提供插槽
答案 0 :(得分:0)
你的意思是“错误”?你有这个说法:
row_number() over (partition by id ) as x
没有order by
,因此返回的行是任意的。我怀疑你想要这个:
SELECT pp.*
FROM (SELECT id, day, start_time, end_time, slot,
row_number() over (partition by id
order by (case when current_time + interval '5 hours 30 minutes' <= end_time then 1
else 2
end) as x
FROM dish_timings_delivery
WHERE id in (101999001247, 101999001225, 10199900100, 101999001223)
) pp
WHERE x < 2;
关键点:ORDER BY
是OVER
语法的一部分。它与用于查询的ORDER BY
子句不同。
此外,您不需要两级子查询。