从上面的第n个位置选择值

时间:2015-08-17 13:42:39

标签: sql sql-server sql-server-2008 tsql

我需要通过从一个字段(比如abc256)中获取相应的值来计算一些东西,我必须从同一列中减去该值但是上面的249行(比如说abc7)然后将它乘以100到一个新的临时表中的列(仅用于显示输出)。

如何从上面的249个字段计算当前值? 我已经订购了列表,因为它应该是2列asc。

所以命令我的列表的查询如下:

select [rN] ,[rD],[r],[rId]
from [someName].[dbo].[some_table]
where rN like '%bla%'
and rD >= 'yyy-mm-dd'

编辑 order by rD asc, rID asc

我需要的伪代码是:

[(case when rN like 'something' then newSomething = (r.value - r.count(249).value))*100) as newSomething)]
  FROM [someName].[dbo].[some_table]
然后我试了

select [rN] ,[rD],[r],[rId]
from select (ROW_NUMBER() over (order by key ASC) AS rownumber,
        r)
    from
[someName].[dbo].[some_table]
where rownumber = r -249
  where rN like '%bla%'
    and rD >= 'yyy-mm-dd'

我应该提到我需要对此进行重复处理(在每个249行之后,我使用当前值计算 - 上面249行的值)。我将为rN like 'something1' ...'something12'

提供12个案例

如何让它发挥作用? 感谢

1 个答案:

答案 0 :(得分:1)

你必须根据自己的特定需求进行调整,但每当我提出“#34;比较一个列到它之前的第n个列”时,#34;问题,我恢复到CTE表达式,然后进行自我加入。我把一个快速的例子拼凑起来让你开始。希望对你有帮助。

-- DROP TABLE IF EXISTS
IF OBJECT_ID('Table_1') IS NOT NULL
    DROP TABLE Table_1
GO

-- CREATE A TABLE FOR TESTING
CREATE TABLE [dbo].[Table_1](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Num1] [int] NULL,
    [Num2] [int] NULL
) ON [PRIMARY]

GO

-- FILL THE TABLE WITH VALUES
DECLARE @cnt INT; SET @cnt = 0
WHILE @cnt <=10000
    BEGIN
      SET @cnt = @cnt + 1
      INSERT INTO Table_1 (Num1, Num2) VALUES (@cnt, @cnt * 1000)
    END
GO 

-- DO THE SELECT
; With RowedTables AS (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY Id ASC) As R,
        T1.*
    FROM Table_1 T1)

SELECT
    RT1.Num1 - RT2.Num1 AS SomeMath, 
    RT1.*,
    RT2.*
FROM RowedTables RT1 JOIN RowedTables RT2 ON RT1.R = RT2.R - 10