SQL Server:计算列值与其他值的比较大小

时间:2009-11-04 14:49:29

标签: sql-server sql-server-2000

我的表格列中填充了浮点值,例如:

   id-Values
   1- 0.19230769230769232
   2- 8.4848484848484854E
   3- 0.10823529411764705
   4- 0.05459770114942529
...

我想知道:是否有一个SQL函数允许我返回所选行位置的百分比与其他行相比?

例如: 我想知道是否有一种简单的方法来检查第4行是否在TOP 10%中。或者,如果第2行位于LAST 10%(按值排序)。

我知道使用SQL Server执行SELECT TOP 10%SELECT LAST 10%是不可能的,但这只是举例说明我想要做的事情。

@Solution:

declare @a int
declare @b int
declare @values float

select @values = values from test where id <= 2

select @a = count(*) from test where values <= @values
select @b = count(*) from test 

select cast( cast(@a as float) / cast(@b as float) as float) * 100 as percentage

3 个答案:

答案 0 :(得分:2)

这是一种方法。基于样本数据集

CREATE TABLE Test (Id int not null, Data float not null)
insert Test values (1, 0.19230769230769232)
insert Test values (2, 8.4848484848484854E) 
insert Test values (3, 0.10823529411764705)  
insert Test values (4, 0.05459770114942529)

这将根据@Id中设置的所需Id值返回您正在寻找的百分比之类的内容:

DECLARE @Id int
SET @Id = 2

SELECT
  Test.*, 100 * xx.Position / (select count(*) from Test) PercentagePosition
 from Test
  inner join (select Id, row_number() over (order by Data) / 1.0 Position from Test) xx
   on xx.Id = Test.Id
 where Test.Id = @Id

我不太喜欢这个,因为它需要两次表扫描。可能会设计快捷方式,具体取决于应用程序需要执行的操作。

答案 1 :(得分:1)

检查以下代码是否对您有所帮助。



declare @a int
declare @b int

select @a = count(*) from Foo where FooId <= 2
select @b = count(*) from Foo 


select cast( cast(@a as float) / cast(@b as float) as float) * 100 as percentage


答案 2 :(得分:0)

好的,这应该是SQL 2000兼容版本。基于与我之前的答案相同的表格结构:

DECLARE
  @Id    int
 ,@Data  float

SET @Id = 3

SELECT @Data = Data
 from Test
 where Id = @Id

SELECT (sum(case when Data < @Data then 1.0 else 0.0 end) + 1) / count(*)
 from Test

假设Id上的索引,现在只有1个表扫描。如果有重复值,这将根据第一次出现选择位置。乱用+1;没有它,第一个值会得到0%,有了它,有四行你得到25% - 那么什么是适合你的应用程序?此外,如果表格为空,您将得到除以零的错误,因此您需要根据您的应用程序处理该错误。