跟踪超过定义值及其倍数的记录

时间:2017-06-13 15:11:30

标签: sql-server

我有一个表“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);

2 个答案:

答案 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

Rextester.com demo

答案 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

请在此处查看:

  

http://rextester.com/QIP53078