获得空值来计算第90百分位数

时间:2015-09-29 02:23:53

标签: sql-server sql-server-2008

这是我的代码

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.

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

似乎where子句过滤掉了你想要的值。

假设填充了所有值,您的代码应返回其中一个值。这是因为所有正数的最大seqnumcntcnt >= 0.9*cnt

另一种可能性是值中包含NULL值。如果是这样,那可能是最后排序,那将是你得到的。

但我的第一个猜测是where条款。如果你将放在子查询中,那么窗口函数将在过滤后使用这组行。那么你应该返回适​​当的值。