2

所以这应该相当简单,而且我确信我缺少一个令人尴尬的简单解决方案,但这里有:

我想根据两个数值变量创建一个数字网格。

更具体地说,我想选择每个变量的第 5 个和第 95 个百分位数,然后将这两个值之间的差异分成 100 个部分,然后按这些部分分组。

所以基本上我需要的是伪代码

(5th percentile)+(95th percentile-5th percentile)/100*[all numbers from 0 to 100]

我可以通过以下查询选择第 5 个和第 95 个百分位数:

SELECT Min(subq.lat) as latitude, percentile FROM
(SELECT round(latitude,2) as lat, ntile(100) OVER (order by latitude desc) as    
'percentile' FROM table   ORDER BY latitude DESC) AS subq
where percentile in (5,95)
group by 2

我也可以创建一个从 0 到 100 的数字列表。

但是如何将这两者结合起来有点超出我的理解。

帮助将不胜感激。

4

2 回答 2

0

你可以用窗口函数做你想做的事。基本上,使用row_number()和总数进行百分位数计算。

这是一个例子:

SELECT lat,
       ((seqnum - 0.05 * cnt) / (0.95 * cnt - 0.05 * cnt)) * 100 as NewPercentile
FROM (SELECT round(latitude,2) as lat,
             row_number() over (order by latitude) as seqnum,
             count(*) over () as cnt
      FROM table
      ORDER BY latitude DESC
     ) AS subq
where seqnum between 0.05 * cnt and 0.95 * cnt
于 2013-05-24T02:33:51.933 回答
0

我不完全确定我是否遵循您的要求,但它可以像循环 1-100 一样简单,对每组执行计算并将它们插入结果表:

CREATE TABLE #Results (Counter_ INT, Calc_Value FLOAT)
GO
DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=100)
BEGIN

--Do Stuff
INSERT INTO #Results
SELECT Counter_ = @intFlag
,Calc_Value = (calculation logic)/@intFlag

SET @intFlag = @intFlag + 1
END
GO

'Do Stuff' 部分针对每个值 1 - 100 执行,(计算逻辑)显然需要用您使用的任何逻辑替换。如果这些值在 1-100 之间是恒定的,则可以将它们设置为变量,这样它们就不必运行 100 次。大致:

CREATE TABLE #Results (Counter_ INT, Calc_Value FLOAT)
GO
DECLARE @intFlag INT, @Percentile_Value FLOAT = (Calculation Logic)
SET @intFlag = 1
WHILE (@intFlag <=100)
BEGIN

--Do Stuff
INSERT INTO #Results
SELECT Counter_ = @intFlag
,Calc_Value = @Percentile_Value/@intFlag

SET @intFlag = @intFlag + 1
END
GO
于 2013-05-24T01:30:02.497 回答