postgresql查询中的分区给出了模棱两可的结果

时间:2016-08-17 13:18:47

标签: sql postgresql postgresql-9.4

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

  • 插槽1:上午11:00至下午1:30
  • 插槽2:07:00 pm至09:00 pm。

我想根据当前时间打开餐厅时选择正确的插槽。例如,如果当前时间是06:15 PM,则查询应返回插槽2,如果当前时间是09:00 AM,则应返回插槽1,如果是10:00 PM,则应返回插槽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_ids(比如101999001247, 101999001225, 10199900100, 101999001223),如上所述查询结果不对。对于一些餐馆,插槽出了问题。

错误的意思是:

注意:current_time的值 - 间隔&#39; 1小时30分钟&#39;在发布时是12:26:34。

多个dish_id的结果: multiple_dish_ids

它应该给插槽1,但为某些菜ID提供插槽

1 个答案:

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

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