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

これは、私が思っているよりも常に難しいことです。課題は、1 つの行を取得することです。私は次のことがそれを行うと思います:

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 に答える