我正在尝试在列表中查找动态百分位数(或者您可以将其视为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的最大值。感谢您的帮助!
答案 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 BY
或GROUP BY
子句中使用字符串-这会产生错误。除非您有一个Identity列,否则订购临时表不会有任何不同。目前尚不清楚为什么甚至需要一个临时表。
答案 1 :(得分:0)
除了Gordon指出的内容之外,如果您要从表中获取特定的(“第n个”)行,TOP n
也是无法做到的。
查看OFFSET
clause in SQL Server.的相对较新的FETCH
和ORDER BY
参数,这是获取表的“ n”行的正确方法。