【发布时间】:2014-10-15 11:46:34
【问题描述】:
我现在正在计划一个 SQL 语句,需要有人来看看我的想法。
这是我的桌子:
id stat period
--- ------- --------
1 10 1/1/2008
2 25 2/1/2008
3 5 3/1/2008
4 15 4/1/2008
5 30 5/1/2008
6 9 6/1/2008
7 22 7/1/2008
8 29 8/1/2008
创建表
CREATE TABLE tbstats
(
id INT IDENTITY(1, 1) PRIMARY KEY,
stat INT NOT NULL,
period DATETIME NOT NULL
)
go
INSERT INTO tbstats
(stat,period)
SELECT 10,CONVERT(DATETIME, '20080101')
UNION ALL
SELECT 25,CONVERT(DATETIME, '20080102')
UNION ALL
SELECT 5,CONVERT(DATETIME, '20080103')
UNION ALL
SELECT 15,CONVERT(DATETIME, '20080104')
UNION ALL
SELECT 30,CONVERT(DATETIME, '20080105')
UNION ALL
SELECT 9,CONVERT(DATETIME, '20080106')
UNION ALL
SELECT 22,CONVERT(DATETIME, '20080107')
UNION ALL
SELECT 29,CONVERT(DATETIME, '20080108')
go
我想计算每个统计量与下一个统计量之间的差异,然后计算“差距”的平均值。
想法:
我需要将每条记录与其后续行连接起来。我可以使用更灵活的连接语法来做到这一点,这要归功于我知道 id 字段是一个没有间隙的整数序列。
通过给表加上别名,我可以将它合并到 SQL 查询中两次,然后通过将第一个别名表的 id 加 1 以交错的方式将它们连接在一起。表中的第一条记录的 id 为 1。1 + 1 = 2 因此它应该加入第二个别名表中 id 为 2 的行。等等。
现在我将简单地从另一个中减去一个。
然后我会使用 ABS 函数来确保我总是得到正整数作为减法的结果,而不管表达式的哪一侧是较高的数字。
有没有更简单的方法来实现我想要的?
【问题讨论】:
标签: sql sql-server join union