希望所有的 SQL GURUS 都做得很好:)
我正在尝试在 SQL Server 2008中模拟LEAD()
和功能。LAG()
这是我的场景:我有一个临时表,它使用基本查询和里程业务逻辑填充。我想计算每个用户每天的累积里程。
临时表是使用 设置的ROW_NUMBER()
,所以除了累积里程之外,我有临时表中需要的所有数据。
我尝试使用带有基本查询的 CTE 并自行加入,但无法使其正常工作。我附上相同的屏幕截图。
任何帮助/建议将不胜感激。
希望所有的 SQL GURUS 都做得很好:)
我正在尝试在 SQL Server 2008中模拟LEAD()
和功能。LAG()
这是我的场景:我有一个临时表,它使用基本查询和里程业务逻辑填充。我想计算每个用户每天的累积里程。
临时表是使用 设置的ROW_NUMBER()
,所以除了累积里程之外,我有临时表中需要的所有数据。
我尝试使用带有基本查询的 CTE 并自行加入,但无法使其正常工作。我附上相同的屏幕截图。
任何帮助/建议将不胜感激。
通过将表连接到自身,您走在了正确的轨道上。我在下面包含了两种执行此操作的方法,在这里应该可以正常工作。第一个技巧是在您的 中ROW_NUMBER
,请务必按用户 ID 进行分区并按日期排序。然后,您可以使用INNER JOIN
with 聚合或CROSS APPLY
构建运行总计。
使用分区设置数据ROW_NUMBER()
:
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)
INNER JOIN
与聚合一起使用
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
用于CROSS APPLY
运行总计
SELECT
UserId,
Date,
Miles,
Total
FROM @Data D1
CROSS APPLY (
SELECT SUM(Miles) AS Total
FROM @Data
WHERE UserId = D1.UserId
AND RowNum <= D1.RowNum
) RunningTotal
每种方法的输出都是相同的:
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