我正在SQL Server 2012上用这个SQL函数编写
;With Quote as
(
SELECT
SID, SHEET, Code, Date, Data,
LAG(Data) OVER(ORDER BY Date) As LastMonthData
FROM
RMQ_DATA
WHERE
[SHEET] IN ('0', '1')
)
SELECT
[Quote].[SID], Quote.DATE, Quote.DATA, Quote.SHEET, Quote.CODE,
CASE
WHEN ISNULL(LastMonthData, 0) = 0 THEN null
ELSE (Data-LastMonthData)/LastMonthData
END As Quote
FROM
Quote
Left outer Join
RMQ_SUBCAT on Quote.CODE =RMQ_SUBCAT.TARGET_CODE
left outer join
RMQ_CAT on RMQ_SUBCAT.TARGET_SID=RMQ_CAT.SID
where
RMQ_CAT.ENABLED='Y' and
Quote.DATE between '2014/01/01' and '2016/12/01'
但在第一行
;With Quote as (
SELECT SID,SHEET,Code, Date, Data,
LAG(Data) OVER(ORDER BY Date) As LastMonthData
FROM RMQ_DATA WHERE [SHEET] IN('0','1'))
LAG(Data)
我有错误。所以我不知道LAG()
函数如何在SQL Server 2008中使用。
我该如何解决这个问题?
答案 0 :(得分:0)
如果您无法在SQL Server 2012中执行此操作,这意味着您无法使用LAG功能,并且您知道“日期”数据没有任何间隙,那么解决方法是自行加入同一个表。
例如,而不是这个
SELECT
SID, SHEET, Code, Date, Data,
LAG(Data) OVER(ORDER BY Date) As LastMonthData
FROM
RMQ_DATA
WHERE
[SHEET] IN ('0', '1')
使用类似的东西
选择A.SID,A.SHEET,A.Code,A.Date,A.Data作为ThisMonthData,B.Data作为LastMonthData 来自RMQ_DATA A,RMQ_DATA B. 其中A.sid = B.sid和A.sheet = B.sheet和A.date = add_months(B.Date,1) 其中[SHEET] IN('0','1')
add_months是一个Oracle函数,无论如何可能不适合你的日期,但你明白了。
如果Date数据中有任何间隙,那么这将无效,您将错过行 - 您需要加入某种行生成器才能使其工作。正如marc_s所说,它变得很快。