动态百分位数查询

时间:2018-12-06 15:14:42

标签: sql sql-server

我正在尝试在列表中查找动态百分位数(或者您可以将其视为Excel中的LARGE函数)。以下是我要查看的内容。 (请原谅非当代的编码习惯,因为我不是程序员)

我首先建立一个临时表来存放我想要的信息。这包括“ Miles”,并由“ Miles” DESC订购。然后,我计算@Lookup_Position始终小于或等于临时表中的@Row_Count。例如,

@Row_Count      @Lookup_Position
0               0
1               0
5               2
50              7 

我知道查找第0行可能是个问题,但我认为到达那儿会越过那座桥。我的问题出在尝试查找表中的@ Lookup_Position'th行时。

DECLARE @Row_Count INT
DECLARE @Lookup_Position INT
DECLARE @Lookedup_Miles DECIMAL

SELECT --Create Temporary Table
INTO #Temporary_Table
FROM --Other Tables
ORDER BY 'Miles' DESC

SELECT @Row_Count = COUNT ( TT.* )
    ,@Lookup_Position = CASE WHEN @RowCount = 1 THEN 0 
        ELSE SQRT ( @Row_Count ) END
FROM #Temporary_Table TT

--Below is where I believe my problem lies since all 
  --other variables return what I expect
SELECT TOP @Lookup_Position
    @Lookedup_Miles = MIN ( TT.Miles )
FROM #Temporary_Table TT
GROUP BY 'Miles'
ORDER BY 'Miles' DESC

在我看来,最后一行代码(ORDER BY 'Miles' DESC)似乎是多余的,但是我相信。我在SQL Management Studio中工作。

我从“ Miles”字段返回了@Lookedup_Miles的输出,但它不是@Lookup_Position的最大值。感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我期望这样的事情:

SELECT TOP (1) @Lookedup_Miles = TT.Miles
FROM #Temporary_Table TT
WHERE TT.Row_Count <= @Lookup_Position
ORDER BY TT.Row_Count DESC;

但是,您的代码充满了许多错误。您不能在ORDER BYGROUP BY子句中使用字符串-这会产生错误。除非您有一个Identity列,否则订购临时表不会有任何不同。目前尚不清楚为什么甚至需要一个临时表。

答案 1 :(得分:0)

除了Gordon指出的内容之外,如果您要从表中获取特定的(“第n个”)行,TOP n也是无法做到的。

查看OFFSET clause in SQL Server.的相对较新的FETCHORDER BY参数,这是获取表的“ n”行的正确方法。