Sql server 2008 SQL Server 2008中的Lead()和LAG()功能

Sql server 2008 SQL Server 2008中的Lead()和LAG()功能,sql-server-2008,tsql,common-table-expression,lag,lead,Sql Server 2008,Tsql,Common Table Expression,Lag,Lead,希望所有的SQL专家都做得很好:) 我正在尝试模拟SQL Server 2008中的LEAD()和LAG()功能 这是我的场景:我有一个临时表,它是使用基本查询和里程的业务逻辑填充的。我想计算每个用户每天的累积里程 临时表是使用行编号()设置的,因此我拥有临时表中除累计里程外所需的所有数据 我曾尝试将CTE与基本查询一起使用,并与自身进行自连接,但无法使其工作。我附上了相同的屏幕截图 如有任何帮助/建议,将不胜感激 通过将表连接到自身,您走上了正确的道路。我在下面列出了两种方法,它们在这里应该可

希望所有的SQL专家都做得很好:)

我正在尝试模拟SQL Server 2008中的
LEAD()
LAG()
功能

这是我的场景:我有一个临时表,它是使用基本查询和里程的业务逻辑填充的。我想计算每个用户每天的累积里程

临时表是使用
行编号()
设置的,因此我拥有临时表中除累计里程外所需的所有数据

我曾尝试将CTE与基本查询一起使用,并与自身进行自连接,但无法使其工作。我附上了相同的屏幕截图


如有任何帮助/建议,将不胜感激

通过将表连接到自身,您走上了正确的道路。我在下面列出了两种方法,它们在这里应该可以很好地工作。第一个技巧是在您的
行编号中
,确保按用户id进行分区并按日期排序。然后,您可以使用带有聚合的
内部联接
,或
交叉应用
来构建您的跑步总数

使用已分区的
行编号()设置数据。

DECLARE @Data TABLE (
    RowNum INT,
    UserId INT,
    Date DATE,
    Miles INT
)
INSERT @Data 
    SELECT
        ROW_NUMBER() OVER (PARTITION BY UserId
            ORDER BY Date) AS RowNum,
        *
    FROM (
        SELECT 1, '2015-01-01', 5
        UNION ALL SELECT 1, '2015-01-02', 6
        UNION ALL SELECT 2, '2015-01-01', 7
        UNION ALL SELECT 2, '2015-01-02', 3
        UNION ALL SELECT 2, '2015-01-03', 2
        ) T (UserId, Date, Miles)
UserId      Date       Miles       Total
----------- ---------- ----------- -----------
1           2015-01-01 5           5
1           2015-01-02 6           11
2           2015-01-01 7           7
2           2015-01-02 3           10
2           2015-01-03 2           12
内部联接
与聚合一起使用

SELECT
    D1.UserId,
    D1.Date,
    D1.Miles,
    SUM(D2.Miles) AS [Total]
FROM @Data D1
    INNER JOIN @Data D2
        ON D1.UserId = D2.UserId
            AND D2.RowNum <= D1.RowNum
GROUP BY
    D1.UserId,
    D1.Date,
    D1.Miles
每个方法的输出相同:

DECLARE @Data TABLE (
    RowNum INT,
    UserId INT,
    Date DATE,
    Miles INT
)
INSERT @Data 
    SELECT
        ROW_NUMBER() OVER (PARTITION BY UserId
            ORDER BY Date) AS RowNum,
        *
    FROM (
        SELECT 1, '2015-01-01', 5
        UNION ALL SELECT 1, '2015-01-02', 6
        UNION ALL SELECT 2, '2015-01-01', 7
        UNION ALL SELECT 2, '2015-01-02', 3
        UNION ALL SELECT 2, '2015-01-03', 2
        ) T (UserId, Date, Miles)
UserId      Date       Miles       Total
----------- ---------- ----------- -----------
1           2015-01-01 5           5
1           2015-01-02 6           11
2           2015-01-01 7           7
2           2015-01-02 3           10
2           2015-01-03 2           12

由于您正在进行每日差异,因此这里没有几个选项,您不能使用a.Date=DateAdd(Day,1,B.Date)将表加入到表本身中吗?