这是我的代码
SELECT columnA, MIN(CASE WHEN seqnum >= 0.9 * cnt THEN value END) as percentile_90
FROM (select t.*,
row_number() over (partition by name order by value) as seqnum,
count(*) over (partition by name) as cnt
from my_table t
) t
WHERE XXXXXXXXXXXXXXX
GROUP BY name
我正确获得了大部分的percentile_90,但其中一些返回null。
For 0.28
0.28
0.29
0.29
0.29
0.29
0.29
0.29
0.29
0.30
0.30, I get null.
For 1.34
1.34
1.35
1.35
1.36
1.36
2.32
2.32
2.80
3.01
3.01, I can get 2.32 from my SQL.
我的代码出了什么问题?
答案 0 :(得分:0)
似乎where
子句过滤掉了你想要的值。
假设填充了所有值,您的代码应返回其中一个值。这是因为所有正数的最大seqnum
为cnt
和cnt >= 0.9*cnt
。
另一种可能性是值中包含NULL
值。如果是这样,那可能是最后排序,那将是你得到的。
但我的第一个猜测是where
条款。如果你将放在子查询中,那么窗口函数将在过滤后使用这组行。那么你应该返回适当的值。