我有一个表“Items”,其中包含显示单个项目的时间进度的记录。其中一列是数值(DeltaLimit),显示与记录起点相比的价格变化。
我也有一个已定义的@Limit变量。我需要选择DeltaLimit第一次超过@Limit的记录,如果DeltaLimit超过@Limit的倍数,我需要做同样的事情。
基本上,我需要DeltaLimit超过@Limit的第一行,DeltaLimit超过2 * @ Limit的第一行,DeltaLimit超过3 * @ Limit等的第一行。
来源数据 - @Limit = 0.5
姓名| DeltaLimit
Ex1 | 0.4
Ex2 | 0.6
Ex3 | 0.9
Ex4 | 1.1
Ex5 | 1.3
期望的输出
姓名| DeltaLimit
Ex2 | 0.6
Ex4 | 1.1
我唯一能做的就是使用以下select选择超出@Limit本身的第一行,但我不知道如何使行超过@Limit的以下倍数。任何帮助都会受到极大的抨击。
select * from Items
where DeltaLimit = (select top 1 DeltaLimit from Items where DeltaLimit < @Limit);
答案 0 :(得分:2)
您可以将DeltaLimit除以Limit并使用结果获取Row_Number。
SELECT * FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY convert(int, DeltaLimit / @Limit) ORDER BY DeltaLimit) Rn
FROM Table1
WHERE DeltaLimit > @Limit
) t
WHERE t.Rn = 1
答案 1 :(得分:0)
您需要为增量限制乘数创建投影关系...基本上是一个值为{.5, 1.0, ,1.5, 2.0
}等的临时表,达到数据所需的最高值。我将其留作练习,只需在下面的代码中调用它#ScaledLimits
即可。一旦你拥有它,你就可以这样使用它:
SELECT results.*
FROM #ScaledLimits sl
CROSS APPLY (
SELECT TOP 1 *
FROM Items
WHERE Items.DeltaLimit > sl.DeltaLimit
ORDER BY Items.DeltaLimit
) results
请在此处查看: