在SQL中是否有Excel的PERCENTRANK(列,值)的等效项?



SQL中是否存在与Excel的PERCENTRANK(列、值)等效的功能?我认为本机SQL Server函数只提供同一列中的百分位数,但我是否遗漏了什么?

问题是,我有两列——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)

这可以作为一个近似的,而不是万无一失的数字解决方案,列作为名称传递:

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

最新更新