所以这应该是相当简单的,而且我确信有一个令人尴尬的解决方案我很想丢失,但这里有:
我想基于两个数字变量创建一个数字网格。
更具体地说,我想选择每个变量的第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之间的数字列表。
但如何将这两者结合起来有点超出我的想法。
非常感谢帮助。
答案 0 :(得分: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
对于每个值1 - 100执行'Do Stuff'部分,(计算逻辑)显然需要用您使用的任何逻辑替换。如果这些值对于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
答案 1 :(得分: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