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

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

【讨论】:

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

以上是关于postgresql 查询中的分区给出不明确的结果的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL分区表(partitioning)应用实例

当明确给出 s3 路径时,模式合并不起作用

将时间戳与查询中的日期名称相等,并在 PostgreSQL 查询中获取结果集 w.r.t 日期名称

PostgreSQL 函数中的列引用不明确

PostgreSQl的分区表创建,插入数据,查询

postgresql 查询中的大结果集