LAG()和LEAD()統計函數能夠在一次查詢中取出同一字段的前N行的數據和后N行的值 。這樣的操作能夠使用對同樣表的表連接來實現,只是使用LAG和 LEAD有更高的效率。下面整理的LAG()和LEAD()樣例:
LAG(EXPRESSION,<OFFSET>,<DEFAULT>)
SQL> select year,region,profit ,lag (profit,1) over (order by year)? as 51xit_exp from test;
YEAR REGION????? PROFIT 51xit_exp
---- ------- ---------- -------------
2003 West??????????? 88
2003 West??????????? 88??????????? 88
2003 Central??????? 101??????????? 88
2003 Central??????? 100?????????? 101
2003 East?????????? 102?????????? 100
2004 West??????????? 77?????????? 102
2004 East?????????? 103??????????? 77
2004 West??????????? 89?????????? 103
LEAD(EXPRESION,<OFFSET>,<DEFAULT>)
SQL> select year,region,profit ,lead (profit,1) over (order by year)? as next_year_exp from test;
YEAR REGION????? PROFIT NEXT_YEAR_EXP
---- ------- ---------- -------------
2003 West??????????? 88??????????? 88
2003 West??????????? 88?????????? 101
2003 Central??????? 101?????????? 100
2003 Central??????? 100?????????? 102
2003 East?????????? 102??????????? 77
2004 West??????????? 77?????????? 103
2004 East?????????? 103??????????? 89
2004 West??????????? 89
Lag函數為Lag(exp,N,defval),defval是當該函數無值可用的情況下返回的值。Lead函數的使用方法類似。
Lead和Lag函數也能夠使用分組,下面是使用region分組的樣例:
SQL> select year,region,profit , lag (profit,1,0) over (PARTITION BY region order by year)??? as 51xit_exp from test;
YEAR REGION????? PROFIT 51xit_exp
---- ------- ---------- -------------
2003 Central??????? 101???????????? 0
2003 Central??????? 100?????????? 101
2003 East?????????? 102???????????? 0
2004 East?????????? 103?????????? 102
2003 West??????????? 88???????????? 0
2003 West??????????? 88??????????? 88
2004 West??????????? 77??????????? 88
2004 West??????????? 89??????????? 77
一SQL問題解答:
問題:
CREATE?? TABLE? ldy_temp_2
(
? 分局??? VARCHAR(255),
派出所??? VARCHAR(255) ,
證件類型??? VARCHAR(255) ,
證件號碼??? VARCHAR(255) ,
姓名??? VARCHAR(255) ,
性別??? VARCHAR(255) ,
行政區劃??? VARCHAR(255) ,
旅館名稱??? VARCHAR(255) ,
旅館地址??? VARCHAR(255) ,
房間號??? VARCHAR(255) ,
入住時間??? VARCHAR(255) ,
col012??? VARCHAR(255)
);
INSERT INTO LDY_TEMP_2
(證件號碼,姓名,旅館名稱,入住時間)
VALUES('1234','ZHANGTAO','A','20100506');
INSERT INTO LDY_TEMP_2
(證件號碼,姓名,旅館名稱,入住時間)
VALUES('1234','ZHANGTAO','A','20100507');
INSERT INTO LDY_TEMP_2
(證件號碼,姓名,旅館名稱,入住時間)
VALUES('1234','ZHANGTAO','B','20100508');
INSERT INTO LDY_TEMP_2
(證件號碼,姓名,旅館名稱,入住時間)
VALUES('1234','ZHANGTAO','A','20100509');
INSERT INTO LDY_TEMP_2
(證件號碼,姓名,旅館名稱,入住時間)
VALUES('1235','ZZZZ','A','20100506');
INSERT INTO LDY_TEMP_2
(證件號碼,姓名,旅館名稱,入住時間)
VALUES('1235','ZZZZ','B','20100507');
INSERT INTO LDY_TEMP_2
(證件號碼,姓名,旅館名稱,入住時間)
VALUES('1235','ZZZZ','A','20100508');
INSERT INTO LDY_TEMP_2
(證件號碼,姓名,旅館名稱,入住時間)
VALUES('1235','ZZZZ','B','20100509');
建表語句和測試數據已經給出? 請問? 怎樣查找相鄰兩次入住旅館名稱不同的人;也就是說 一個人的證件號碼是123的話 那么這個人的信息依照入住時間排序后? 相鄰兩條數據的旅館名稱不能一樣 。
解答:
with temp_a as
(select
??????? t.證件號碼,
??????? t.旅館名稱,
??????? t.入住時間,
??????? lag(t.旅館名稱) over (partition by t.證件號碼 order by t.入住時間) as lagname
from ldy_temp_2 t)
select 證件號碼,姓名,旅館名稱,入住時間
from ldy_temp_2 a
where a.證件號碼 not in (select b.證件號碼 from temp_a b where? b.旅館名稱=b.lagname)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
