2014-04-02 66 views
1

我有一個〜5000行的表,每個表都有幾列,還有一些表可能包含也可能不包含在列表中的已知值。獲取已知值的百分位

我想要做的是按順序依次排列不同的列,然後找到映射到該列的已知值的大致百分位數。我只需要大約10個百分點的括號(例如,如果第10百分位的截止點是6,第20百分位的截止點是14,並且我已知的值是7,我將返回0.2)。

我不能依賴列中正在計算百分位數的已知值。

我計算百分位數「水桶」這樣的:通過這些

upperVal | Percentile 
======== | ========== 
27  | 0.1 
58  | 0.2 
89  | 0.3 
120  | 0.4 
158  | 0.5 
200  | 0.6 
254  | 0.7 
336  | 0.8 
495  | 0.9 
2450  | 1 

的的一部分,這絆倒我的是如何最好地循環:

SELECT MAX(colName) as upperVal, (CAST(Percentile as float)/10.0) as Percentile FROM (
    SELECT colName, NTILE(10) OVER(ORDER BY colNameASC) AS Percentile FROM tableName AS a 
) as b GROUP BY Percentile 

,給了我一個數值表並獲得已知值的百分位「桶」(不會引入太多開銷)。

任何人都可以幫助闡明這一點嗎?

回答

1

我想到了使用相關子查詢的解決方案。找到所有的上限值比你的值,然後選擇較小的一個:

with percentiles as (
     SELECT MAX(colName) as upperVal, (CAST(Percentile as float)/10.0) as Percentile 
     FROM (SELECT colName, NTILE(10) OVER(ORDER BY colNameASC) AS Percentile 
      FROM tableName AS a 
      ) as b 
     GROUP BY Percentile 
    ) 
select kv.value, 
     (select top 1 Percentile 
     from percentiles p 
     where p.upperVal >= kv.value 
     order by upperVal 
     ) 
from KnownValues kv; 

你也可以使用這種利用apply

+0

與另一顯影劑橡膠鴨調試之後,我們來到了一個非常類似的解決方案: 選擇TOP 1百分從( \t SELECT MAX(COLNAME)作爲upperVal,(CAST(百分爲float)/ 10.0)作爲百分FROM( \t \t SELECT COLNAME,NTILE(10)OVER(ORDER BY COLNAME ASC)AS百分FROM TABLENAME AS一個 \t)爲b GROUP BY百分)爲c WHERE upperVal <= knownValue ORDER BY upperVal DESC – MassivePenguin