2016-08-17 22 views
2

有几家餐馆(说)在我们的数据库这多个插槽(比如2)插槽打开:分区PostgreSQL的查询给出模棱两可的结果

  • 插槽1:上午11时至下午1点30分
  • 插槽2:下午07:00至晚上9:00。

我想根据当前时间选择餐厅打开时的正确位置。例如,如果当前时间是06:15 PM,则查询应当返回时隙2,如果当前时间是上午09:00,则返回时隙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_ids(比如101999001247, 101999001225, 10199900100, 101999001223),如上面的查询结果是不正确的。对于一些餐馆老虎机来说是错误的。

通过错了我的意思是这样的:

注意:CURRENT_TIME的价值 - 时间间隔“1小时30分”是12时26分34秒在张贴时间。

结果多dish_ids: multiple_dish_ids

它应该给插槽1,但给人插槽2对一些菜IDS

+0

对于失败的案例,表格中的数据是什么,您得到的结果是什么以及您期望的结果是什么? – jmarkmurphy

+0

@jmarkmurphy plz检查新的更新。 –

回答

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子句不同。

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

+0

我试过了你的查询,但仍然给出了错误的结果。我已经在问题中发布了截图以供参考。 – duffercoder