【问题标题】:Create evenly spaced out sequence in SQL在 SQL 中创建均匀间隔的序列
【发布时间】:2013-05-24 10:33:51
【问题描述】:

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

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

更具体地说,我想选择每个变量的第 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 的数字列表。

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

我们将不胜感激。

【问题讨论】:

  • 所以基本上你想创建一条从第 5 个 %ile 值到第 95 个的平滑线,它们之间有 100 步?您是否真的想要 90 步(这样每一步都可以代表一个 %ile 点)?
  • 不,肯定是 100。基本上,5 到 95 是一个置信区间,我想将它分成 100 个部分。否则我可以从上面的 sql 中取出 where 子句并完成。

标签: sql


【解决方案1】:

我不完全确定我是否遵循您的要求,但它可以像循环 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

【讨论】:

    【解决方案2】:

    你可以用窗口函数做你想做的事。基本上,用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
    

    【讨论】:

      猜你喜欢
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      相关资源
      最近更新 更多