2016-06-13 59 views
0

SQL中的Excel的PERCENTRANK(列,值)是否等價?我認爲本機SQL Server函數只提供來自同一列的百分位數,但是我錯過了什麼?在SQL中是否有等效的Excel的PERCENTRANK(列,值)?

問題是我有兩列 - A和B - 我需要使用列A中的值的分佈,然後從另一列中取值,並將它們對列A排序 - B中的值如何適合分佈由列A定義(或者,確切地說:在由B定義的點處獲得列A的CDF)。

可能的解決方案:

  1. 寫UDF(他們不併行,不是嗎?) - 你能回答我如何能有效地結構,UDF?
  2. 使用SQL Server 2016和它有R集成(SQL代碼R內碼)
  3. 數據複製到R,執行計算,發送回服務器
  4. 將數據複製到Excel和計算它在那裏「手動」,將結果導回到數據庫

我需要將這個策略應用於多個值和分佈的列,因此我正在尋找一個有效的解決方案。

編輯 - 例如: column A column B result 10 16 0,20 =PERCENTRANK($A1:$A4, B1) 20 35 0,83 =PERCENTRANK($A1:$A4, B2) 30 10 0,00 =PERCENTRANK($A1:$A4, B3) 40 25 0,50 =PERCENTRANK($A1:$A4, B4)

回答

0

這可以作爲與柱的近似,並非萬無一失數值解的名字被傳遞:

CREATE FUNCTION [dbo].[PERCENTRANK_column](
    @colname nvarchar(50) 
) 
RETURNS @resultingtable TABLE(
    RowID int, 
    PercentRank float 
) 
AS 
BEGIN 


;WITH true_CDF AS (
    SELECT 

     PERCENT_RANK() OVER (PARTITION BY 1 ORDER BY 
      CASE @colname 
      WHEN 'X' THEN X 
      WHEN 'Y' THEN Y 
      ELSE NULL 
      END 
     ASC) as PercentRank 
     , 
     CASE @colname 
      WHEN 'X' THEN X 
      WHEN 'Y' THEN Y 
      ELSE NULL 
     END AS selected_col 
    FROM dbo.MainTable 
) 
, selectColumn AS (
    SELECT 
    m.RowID 
    ,CASE @colname 
      WHEN 'X' THEN to_score_X 
      WHEN 'Y' THEN to_score_Y 
      ELSE NULL 
     END as to_score 
     FROM dbo.MainTable m 
) 
, added_Mins AS (
    SELECT 
      B.RowID 
     , ABS(B.to_score - A.selected_col) as diff 
     , MIN(ABS(B.to_score - A.selected_col)) OVER (PARTITION BY 1) as lowest_difference 
     , A.PercentRank 
    FROM selectColumn B 
    CROSS JOIN true_CDF A 
) 
INSERT INTO @resultingtable 
SELECT 
    RowID, PercentRank 
FROM added_Mins 
WHERE lowest_difference = diff 

RETURN 

END 
相關問題