我需要通过从一个字段(比如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'
如何让它发挥作用? 感谢
答案 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