Ссылка на предыдущее значение строки для арифметического вычисления в SQL Server 2008 R2 - PullRequest
2 голосов
/ 22 марта 2012

Я работаю с SQL Server 2008 R2 и новичком в реляционной базе данных.Мне нужно выполнить простое вычисление, но вычисление включает в себя использование предыдущего значения строки.

Пример:

(Value of X) / ((Value of Y at time t + Value of Y at time t-1) / 2)

Пример:

select (x/[(y@time,t + y@time,t-1)/2]) as 'Value'
from datatable
select ((c.ACHQ)/(c.RECTQ(row:n) + c.RETQ(row:n-1))/2) as 'AR'
from co_ifndq c
where c.GVKEY in 
(select GVKEY 
    from spidx_cst
    where DATADATE = '2012-03-12'
    and INDEXID = '500')
and c.DATAFMT = 'std'
and c.DATADATE > '1990-12-30'
order by c.GVKEY, datadate desc

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Предполагая, что x, y и t находятся в одной таблице, попробуйте:

;with cte as (
select m.*, row_number() over (order by t) rn from mytable)
select t1.t, t1.x / ((t1.y + t0.y)/2) as [value]
from cte t1
left join cte t0 on t0.rn = t1.rn-1

РЕДАКТИРОВАТЬ: на основе предоставленного запроса:

;with cte as (
select c.*, row_number() over (partition by c.GVKEY order by c.DATADATE) rn 
from co_ifndq c
where c.GVKEY in 
(select GVKEY 
 from spidx_cst
 where DATADATE = '2012-03-12' and INDEXID = '500')
and c.DATAFMT = 'std'
and c.DATADATE > '1990-12-30'
)
select t1.GVKEY, t1.DATADATE, t1.ACHQ / ((t1.RETQ + t0.RETQ)/2) as [value]
from cte t1
left join cte t0 on t1.GVKEY = t0.GVKEY and t0.rn = t1.rn-1
order by t1.GVKEY, t1.datadate desc
0 голосов
/ 22 марта 2012

Насколько я понимаю, вы хотите сделать расчет на основе разницы дат, а не на основе порядка строк, верно?

Если это так, если у вас есть такой стол

CREATE TABLE YourTable(
    ACHQ float ,
    RECTQ float,
    DATE datetime)

INSERT INTO YourTable VALUES    (100,10,'20100101')
INSERT INTO YourTable VALUES    (200,20,'20110101')
INSERT INTO YourTable VALUES    (300,30,'20120101')
INSERT INTO YourTable VALUES    (400,40,'20130101')
INSERT INTO YourTable VALUES    (500,50,'20140101')
INSERT INTO YourTable VALUES    (600,60,'20150101')

вы можете сделать что-то вроде этого

SELECT
    ((c.ACHQ)/(c.RECTQ + cPreviousYear.RECTQ)/2) as 'AR'
FROM
    YourTable c
        LEFT JOIN YourTable cPreviousYear
            ON YEAR(c.Date) - 1 = YEAR(cPreviousYear.Date)

Я упростил расчет, чтобы показать, что вы можете связать таблицу с самой собой непосредственно со строкой с требуемой разницей в датах и ​​затем вычислить значение. Вы даже можете использовать ON DATEADD(y, -1, c.Date) = cPrevious.Date, если хотите разницу в реальной дате

Извините, если я упустил момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...