hive求相鄰兩行數據的差值


參考鏈接:https://www.cnblogs.com/dqz19892013/archive/2013/04/11/3014239.html

以下的SQL全部在oracle數據庫下執行,其他數據庫是否支持這些函數,未知,有待驗證。

1.DECODE()

該函數語法如下

DECODE(expression, if1, value1, if2,value2, if3,value3, . . ., default)

意思是說,如果expression的值等於if1的值,返回value1,如果不等,再和if2比較,相等返回value2,以此類推,如果所有的條件都不滿足,返回default默認值。

看下面SQL

Sql代碼
SELECT DECODE(1,1,'男',0,'女','未知') FROM DUAL  --1
SELECT DECODE(0,1,'男',0,'女','未知') FROM DUAL  --2
SELECT DECODE(3,1,'男',0,'女','未知') FROM DUAL  --3
SELECT DECODE(3,1,'男',0,'女') FROM DUAL  --4

第一條結果是"男",第二條結果是"女",第三條結果是"未知",第四條結果為空。

也就是說如果沒有默認值,而前面的所有條件又都沒有匹配,則返回空。

2. LAG()

這個函數可以取出某個字段前N條記錄的值。對如下表

進行下面的SQL查詢

Sql代碼
SELECT C.*,LAG(C.CNAME,1) OVER(ORDER BY C.CNO) FROM COURSE C

所得結果如下

第一條記錄已經無法再取前一條記錄,所以LAG()函數返回空。

SQL為意思如下。

    LAG(C.CNAME, 1) 表示取前一條記錄的CNAME的值。

    OVER(ORDER BY C.CNO)表示按CNO來排序,然后決定記錄之間的前后關系。

    在over()里面還可以加入partition by,如下SQL

Sql代碼
SELECT C.*,LAG(C.CNAME,1) OVER(PARTITION BY C.TNO ORDER BY C.CNO) FROM COURSE C

結果如下

partition by是用來分區的。對TNO進行分區,在不同的TNO下尋找上一條記錄的CNAME的值。

所以查詢結果中t001,t002,t003中分別有一條記錄最后的值為空。

如果希望在沒有前N條記錄的時候不返回空,可以使用默認值,SQL如下

Sql代碼
SELECT C.*,LAG(C.CNAME,1,'default') OVER(PARTITION BY C.TNO ORDER BY C.CNO) FROM COURSE C

結果如下

在原來的空值的地方出現了default,當然這個值根據自己的需要設定想要的值。

LEAD()函數與此類似,不過它是查詢某字段的后N條記錄的值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM