我注意到在大桌子上使用postgres-ntile的奇怪行为。它的顺序不对。例如:

select tile, min(price) as minprice, max(price) as maxprice, count(*)
from (
    select ntile(2) over(order by price ASC) as tile, adult_price as price
    from statistics."trips"
    where back_date IS NULL AND adult_price IS NOT null
    and departure = 297 and arrival = 151
) as t
group by tile

依我看,这真是个奇怪的结果:
tile    minprice    maxprice    count
1       2250        5359        74257
2       2250        27735       74257

count和maxprice没什么特别的。对于某些数据集来说可能是正确的。不过,明盘显示,订货有问题。
第二块瓷砖的最低价格怎么能比第一块瓷砖的最高价格低呢?但这是通过检查内部选择的结果来证实的。它只订购了一部分,有些“混合”部分的价格订单被打破。
分为两部分手动显示相同的最低和最高价格,但中间价格不同:
select * from (
    select row_number() over (order by adult_price ASC) as row_number, adult_price
    from statistics."trips"
    where back_date IS NULL AND adult_price IS NOT null
    and departure = 297 and arrival = 151
    order by price
) as t
where row_number IN(1, 74257, 74258, 148514)

row_number adult_price
1          2250
74257      4075
74258      4075
149413     27735

最佳答案

它一定是令人困惑的列名。
外部查询中的列price实际上是内部查询中的列adult_price,而ntile是由不同的列(price在内部查询中)按顺序计算的。

10-07 14:57