postgresql 查询中的分区给出不明确的结果
Posted
技术标签:
【中文标题】postgresql 查询中的分区给出不明确的结果【英文标题】:Partition in postgresql query giving ambiguous results 【发布时间】:2016-08-17 13:18:47 【问题描述】:在我们的数据库中有几家餐馆(比如 A)在多个插槽(比如 2 个)插槽中打开:
时段 1:上午 11:00 至下午 1:30 时段 2:07:00 pm 到 09:00 pm。我想根据当前时间选择餐厅开门的正确时段。例如,如果当前时间是 06:15 PM,则查询应返回 slot 2,如果当前时间是 09:00 AM,则应返回 slot 1,如果是 10:00 PM,则应返回 slot 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 - 间隔“1 小时 30 分钟”的值是发帖时的 12:26:34。
多个 disc_id 的结果:
它应该给插槽 1,但给插槽 2 用于某些菜 id
【问题讨论】:
对于失败的情况,表中的数据是什么,你得到什么结果,你期望什么结果? @jmarkmurphy 请检查新的更新。 【参考方案1】:“错误”是什么意思?你有这样的声明:
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
子句。
此外,您不需要两级子查询。
【讨论】:
我试过你的查询,但它仍然像以前一样给出错误的结果。我已经在问题中发布了截图以供参考。以上是关于postgresql 查询中的分区给出不明确的结果的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL分区表(partitioning)应用实例