0

我有以下代码,我从表中选择 LossAmount 值,在该表中我创建了一个序列列以及我的 LossAmount 列,并根据特定的序列号选择 LossAmount 值。

declare @percent float
set @percent = 0.95

select LossAmount
from (select LossAmount, seq = ROW_NUMBER() over (order by LossAmount desc) from dbo.TestXB_TotalLoss) as p
where p.seq =((select COUNT(*) from dbo.TestXB_TotalLoss)-((select COUNT(*) from dbo.TestXB_TotalLoss)*@percent))

所以说我的 LossAmount 列有 1000 行,p.seq 方程是1000-1000(0.95). 我在该序列号(即 50)处选择 LossAmount 值。

就我而言,我的参数是一个标量。如果我要计算各种百分比,如何更新我的代码?我有下表,dbo.Percentiles

Percentiles
0.4
0.6
0.996

对于我的输出,我想要这样的东西。

Percentiles   LossAmount
0.4           ...some #...
0.6           ...some #...
0.996         ...some #...

任何帮助将不胜感激。

4

2 回答 2

0

这总是比我认为的要难。挑战是让一排出来。我认为以下内容可以做到:

select pt.pcent, min(LossAmount)
from (select tl.*, p.pcent, ROW_NUMBER() over (order by LossAmount desc) as seqnum,
             count(*) over () as totnum
      from dbo.TestXB_TotalLoss cross join
           (select 0.95 as pcent
           ) p
     ) pt
where totnum*pcent - seqnum >= 0 and totnum*pcent - seqnum < 1

这会将百分比移动到内部表p中并进行交叉连接。然后,它选择计划行号 ( totnum*pcent) 与实际行号 ( seqnum) 之间的差为非负且小于 1 的行。

我没有测试过这个特定的查询,所以它可能有语法错误。

于 2013-01-15T20:33:13.763 回答
0

我认为这应该对你有用,有更简洁的方法来编写它,但我想尽可能少地更改你的代码......

select  LossAmount, n.percentiles
from   (select  LossAmount, 
                seq = ROW_NUMBER() over (order by LossAmount desc) 
        from    dbo.TestXB_TotalLoss) as p
join   (Select ((select COUNT(*) from dbo.TestXB_TotalLoss)-((select COUNT(*) from dbo.TestXB_TotalLoss)*percentiles)) As seq, percentiles
        From    dbo.Percentiles) n
        On  p.seq = n.seq
于 2013-01-15T20:35:06.987 回答