gpt4 book ai didi

sql - postgresql 查询中的分区给出不明确的结果

转载 作者:行者123 更新时间:2023-11-29 12:25:42 26 4
gpt4 key购买 nike

我们的数据库中很少有餐厅(比如 A)在多个插槽(比如 2)插槽中打开:

  • 时段 1:上午 11:00 至下午 1:30
  • 时段 2:晚上 7:00 到晚上 9:00。

我想根据当前时间选择正确的餐厅开门时段。例如,如果当前时间是 06:15 PM,则查询应返回槽 2,如果当前时间是 09:00 AM,则应返回槽 1,如果是晚上 10:00,则应返回槽 1。因此,下一个合适的时段应该到来。

餐厅的时间​​存储在 dish_timings_delivery 表中,其列如图所示: screenshot to show data我的查询:

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_id(例如 101999001247, 101999001225, 10199900100, 101999001223) 如上查询结果不正确。对于某些餐厅,插槽出现错误。

我的意思是错误的:

注意:在发布时,current_time - interval '1 hours 30 minutes' 的值为 12:26:34。

多个 dish_ids 的结果: multiple_dish_ids

它应该给 slot 1 但给一些 dish id 给 slot 2

最佳答案

“错误”是什么意思?你有这个声明:

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 BYOVER 语法的一部分。它不同于用于查询的 ORDER BY 子句。

此外,您不需要两级子查询。

关于sql - postgresql 查询中的分区给出不明确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38997850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com