问题:
SQL Server 2012引入了两个新分析函数, LEAD() 和 LAG() 。下面介绍一下这两个函数的用法。
解决方案:
这两个函数对一个序列化的数据进行查询,返回同一结果集中的后一行(lead)和前一行(lag)数据,而不用写复杂的自关联(self-join)查询语句(梦魇)~
Lead和Lag函数的语法:
LAG|LEAD (scalar_expression [,offset] [,default])
OVER ( [ partition_by_clause ] order_by_clause )
让我们来在TestDB中创建一张表 Test_table ,并插入一些数据。
CREATE DATABASE [TestDB]
--Create testable to hold some data
CREATE TABLE [dbo].[Test_table](
[id] [int] IDENTITY(1,1) NOT NULL,
[Department] [nchar](10) NOT NULL,
[Code] [int] NOT NULL,
CONSTRAINT [PK_Test_table] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
--Insert some test data
insert into Test_table values('A',111)
insert into Test_table values('B',29)
insert into Test_table values('C',258)
insert into Test_table values('D',333)
insert into Test_table values('E',15)
insert into Test_table values('F',449)
insert into Test_table values('G',419)
insert into Test_table values('H',555)
insert into Test_table values('I',524)
insert into Test_table values('J',698)
insert into Test_table values('K',715)
insert into Test_table values('L',799)
insert into Test_table values('M',139)
insert into Test_table values('N',219)
insert into Test_table values('O',869)
表数据就是这样的:
写一个查询语句:
SELECT id,department,Code, LEAD(Code,1) OVER (ORDER BY Code ) LeadValue, LAG(Code,1) OVER (ORDER BY Code ) LagValue FROM test_table
全面的查询语句示例,前移或后移都是1行(偏移量),也可以根据需要设置其他移动行数,但偏移量必须是正整数!当偏移量超出结果集后,默认会等于NULL空值,也可以指定某个数值来取代。
SELECT id,department,Code, LEAD(Code,2,0) OVER (ORDER BY Code ) LeadValue, LAG(Code,3,0) OVER (ORDER BY Code ) LagValue FFROM test_table
使用情景:
在点击流数据仓库ETL过程中,这两个函数非常实用!譬如,了解某个访问者的点击流过程,单一页面的访问时长,以及可能退出页面和退出率统计!而且,这个查询非常快!!!
点击流数据仓库的具体设计和分析模型,这里就暂不展开讨论了。