//題目:
id name
------------
1 張
1 王
2 趙
//結果:
id name
--------
1 張
王 2 趙
//解法一:
with t as(
select 1 id, '張' name from dual union all
select 1 id, '王' name from dual union all
select 1 id, '李' name from dual union all
select 2 id, '趙' name from dual)
select nullif(id, pid) id, name
from (
select id, name,
lag(id) over(partition by id order by id) pid
from t)
id name
---------- ----
1 張
王 李
2 趙
//分析:
//這裡巧妙的利用了lag()分析函式,
//此函式可一次性的返回多行資料,而不需要進行表的自連線
//而且可以將距離第一行記錄幾行的記錄返回,若沒有記錄就返回null
//下面是巢狀檢視的查詢結果:
select id, name,
lag(id) over(partition by id order by id) pid
from t
/ id name pid
---------- ---- ----------
1 張
1 王 1
1 李 1
2 趙
//我們再來看外層查詢,即主查詢
//這裡使用到了nullif()函式,本人還是頭一次看到此函式
//這個函式有兩個引數,nullif(x,y),
//它將x和y進行比較,如果x=y,則返回值為null,如果不等,則返回x
for example:
nullif(12, 12) would return null
nullif(12, 13) would return 12
// //解法二:
with tt as(
select 1 id, '張' name from dual union all
select 1 id, '王' name from dual union all
select 1 id, '李' name from dual union all
select 2 id, '趙' name from dual)
select decode(row_number() over(partition by id order by id),1,id) id,
name
from tt
id name
1 張
王 李
2 趙
//解析:
//此解法是用到了視窗函式row_number()分析函式,
//此函式是為每乙個分組和排序返回乙個排序值,用法有點像rownum
//我們來看看如果沒用decode函式結果是怎麼樣的:
select row_number() over(partition by id order by id) id,
name
from tt
id name
---------- ----
1 張
2 王
3 李
1 趙
//使用decode函式是為了進行比較的,
//如果row_number函式返回的id值為1,那麼就顯示此id值
//如果row_number函式返回的id值不為1,那麼就顯示null
//所以我們看到了上面的結果:張的id為1,趙的id也為1
原帖:oracle nullif()函式
oracle lag()分析函式:
oracle row_number()分析函式:
函式的用法 Excel函式TREND函式的用法
trend函式是乙個線性趨勢的 函式,在已知y值 x值的條件下,x對應的y值 trend共有4個引數,三個必選引數,乙個可選引數 同樣的一組資料第四引數不同,結果也是有區別的 灰色曲線是由第四引數為false時得到的結果生成的曲線。通過斜率與截距函式我們計算出這兩條曲線的斜率與截距,可以看出,第四引...
main函式的入口函式
作業系統裝載程式之後,首先執行的 並不是main的第一行,而是某些別的 這些 負責準備好main函式執行所需要的環境,並且負責呼叫main函式,執行這些 的函式稱為入口函式或入口點 entry point 視平台的不同而有不同的名字。程式的入口點實際上是乙個程式的初始化和結束部分,它往往是執行庫的一...
返回函式的函式
廖雪峰python課程裡的 作業的兩種實現方法 1.def createcounter a 0 def counter nonlocal a nonlocal 函式是 引用外部函式 的函式 a 1 a 1等同於a a 1 return a return counter countera create...