我注意到在大桌子上使用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没什么特别的。对于某些数据集可能是正确的。但是min_price表明排序有问题。
第二个瓷砖的min_price如何从第一个小于max_price?但这是通过检查内部选择的结果来批准的。它仅部分订购,并且有一些“混合”部件,价格订单被打破。
手动拆分2部分显示相同的最低和最高价格,但中间价格不同:
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
答案 0 :(得分:0)
一定是令人困惑的列名。
外部查询中的列price
实际上是内部查询中的adult_price
,而ntile
是按内部查询中的不同列(price
计算的排序)。