我有一张这样的表:
Name Poin
================
ANA 5
ANA 10
ANA 3
ANA 8
ANA 7
ANA 5
我希望像以下一样连续获得最后2行的AVG:
Name Poin AVG 2
=========================
ANA 5 7.5
ANA 10 6.5
ANA 3 5.5
ANA 8 7.5
ANA 7 6
ANA 5 5
“AVG 2”列是行和行-1之间的平均值。我怎样才能做到这一点?提前致谢
答案 0 :(得分:2)
您可以尝试windowing function with OVER()
DECLARE @table TABLE (Id int, Name nvarchar(10), Poin float)
INSERT INTO @table
VALUES
(1, N'ANA',5),
(2, N'ANA',10),
(3, N'ANA',3),
(4, N'ANA',8),
(5, N'ANA',7),
(6, N'ANA',5);
SELECT AVG(Poin) OVER(PARTITION BY Name
ORDER BY Id
ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING)
FROM @table;
结果
7,5
6,5
5,5
7,5
6
5
重要强>:
请注意,您的表格中有无隐含订单。没有特定的ORDER BY
,结果是随机的!
答案 1 :(得分:0)
使用LEAD功能,您可以获得按Id排序的下一行:
DECLARE @table TABLE (Id int, Name nvarchar(10), Poin float)
INSERT INTO @table
VALUES
(1, N'ANA',5),
(2, N'ANA',10),
(3, N'ANA',3),
(4, N'ANA',8),
(5, N'ANA',7),
(6, N'ANA',5)
SELECT
t.Id,
(t.Poin + LEAD(t.Poin, 1, t.Poin) OVER (ORDER BY t.Id)) / 2
FROM @table AS t
LEAD(t.Poin, 1, t.Poin)
LEAD
- 获取下一个第N行t.Poin
- 列1
- 前进一行t.Poin
- 当没有下一个值时替换最后一行