窗口函数LAG、LEAD、FIRSTVALUE、LASTVALUE用法 这组函数相对不好理解,下面将结合用户的访问记录数据来进行说明,大家仔细体会。原始表数据vistitlog表deviceidpagevistittimedtandroid1homepage2022030111:01:0120220301android2channelpage2022030108:08:0820220301android1detailpage12022030111:02:0120220301android2detailpage32022030109:00:0020220301android1detailpage22022030118:01:0020220301。。。。LAG语法LAG(column,n,defaultvalue),取统计窗口内往上第n行值,column为需要操作的列,n为取第几行的数据〔可选默认为1〕,defaultvalue为缺省值〔可选默认为null〕,当取不到数据时,默认取defaultvalue,如未设置缺省值,取不到数据时默认为null。。 partitionby指定分组字段,orderby指定排序列并指定顺序还是逆序。按设备分组,按访问时间正序,取上一条记录中的时间做为本记录的lasttime,一般可以用于计算当前页面的浏览时间。selectdeviceid,page,vistittime,lag(vistittime,1,1970010100:00:00)over(PARTITIONBYdeviceidORDERBYvistittimeasc)aslasttimefromvistitlogwheredt20220301;deviceidpagevistittimelasttimeandroid1homepage2022030111:01:011970010100:00:00android1detailpage12022030111:02:012022030111:01:01android1detailpage22022030118:01:002022030111:02:01android2channelpage2022030108:08:081970010100:00:00android2detailpage32022030109:00:002022030108:08:08 LEAG语法LEAG(column,n,defaultvalue),取统计窗口内往下第n行值,column为需要操作的列,n为取第几行的数据〔可选默认为1〕,defaultvalue为缺省值〔可选默认为null〕,当取不到数据时,默认取defaultvalue,如未设置缺省值,取不到数据时默认为null。 partitionby指定分组字段,orderby指定排序列并指定顺序还是逆序。按设备分组,按访问时间正序,取下一条记录中的时间做为本记录的lasttime,一般可以用于计算当前页面的浏览时间。selectdeviceid,page,vistittime,leag(vistittime,1,1970010100:00:00)over(PARTITIONBYdeviceidORDERBYvistittimeasc)aslasttimefromvistitlogwheredt20220301;deviceidpagevistittimelasttimeandroid1homepage2022030111:01:012022030111:02:01android1detailpage12022030111:02:012022030118:01:00android1detailpage22022030118:01:001970010100:00:00android2channelpage2022030108:08:082022030109:00:00android2detailpage32022030109:00:001970010100:00:00 FIRSTVALUE 取分组内排序后,截止到当前行,第一个值按设备分组,按访问时间正序,该分组中的第一行做为当前行的值selectdeviceid,page,vistittime,firstvalue(vistittime)over(PARTITIONBYdeviceidORDERBYvistittimeasc)asfirsttimefromvistitlogwheredt20220301;deviceidpagevistittimefirsttimeandroid1homepage2022030111:01:012022030111:01:01android1detailpage12022030111:02:012022030111:01:01android1detailpage22022030118:01:002022030111:01:01android2channelpage2022030108:08:082022030108:08:08android2detailpage32022030109:00:002022030108:08:08LASTVALUE 取分组内排序后,截止到当前行,最后一个值按设备分组,按访问时间正序,该分组中的最后一行做为当前行的值selectdeviceid,page,vistittime,firstvalue(vistittime)over(PARTITIONBYdeviceidORDERBYvistittimeasc)aslasttimefromvistitlogwheredt20220301;deviceidpagevistittimelasttimeandroid1homepage2022030111:01:012022030111:01:01android1detailpage12022030111:02:012022030111:02:01android1detailpage22022030118:01:002022030118:01:00android2channelpage2022030108:08:082022030108:08:08android2detailpage32022030109:00:002022030109:00:00可以看出,由于是此函数是截止到当前记录取最后一值,如果排序还用正序的话,并没有达到想要的效果,所以应该改为:(为了观察方便,在最后做了排序输出)selectdeviceid,page,vistittime,firstvalue(vistittime)over(PARTITIONBYdeviceidORDERBYvistittimedesc)aslasttimefromvistitlogwheredt20220301orderbydeviceid,deviceidpagevistittimelasttimeandroid1homepage2022030111:01:012022030118:01:00android1detailpage12022030111:02:012022030118:01:00android1detailpage22022030118:01:002022030118:01:00android2channelpage2022030108:08:08022030109:00:00android2detailpage32022030109:00:002022030109:00:00