SQL Server 2008中的LAG功能

时间:2016-05-21 06:47:30

标签: sql sql-server sql-server-2008 sql-server-2012

我正在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中使用。

我该如何解决这个问题?

1 个答案:

答案 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所说,它变得很快。