2016-08-17 34 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