oracle查詢技巧以及函式使用

2021-07-28 14:52:06 字數 2228 閱讀 7915

確定一段資料連續值得開始點和結束點

如下面的nba每年獲得總冠軍的隊伍資料:

統計連續獲得總冠軍的隊伍名稱,以及年份的開始和結束點

**如下:

with cte as

(select row_number() over(order by nvl(a.y, 9999)) id,

a.*,

b.tname t1,

b.y y1

from nba a

full join nba b

on a.y = b.y + 1

where a.tname <> b.tname

or a.team is null

or b.team is null)

--select * from cte;

--select * from nba;

select a.tname, a.y, b.y1

from cte a, cte b

where a.id = b.id - 1

and a.y <> b.y1

解析:

with cte as

(select row_number() over(order by nvl(a.y, 9999)) id,

a.*,

b.tname t1,

b.y y1

from nba a

full join nba b

on a.y = b.y + 1

where a.tname <> b.tname

or a.team is null or b.team is null) //此處新增為應對如果資料中第1,2年,和最後兩年是乙個隊伍連續獲獎被剔除的可能。

此部分**得到如下資料:

(0)因為原始資料已經按照年份進行排序,

(1)在對資料的操作過程中:可以根據t-1年和t年隨對應的隊伍名稱是否一致來判斷是否連續。

(2)**中用相反的策略,剔除t-1年和t年隊伍相同的資料,得到以上資料。

(3)以上資料說明:編號相連兩行資料y和y1表示了乙個隊伍連續獲得冠軍的區間。(此處不需要再考慮這兩個的tname和t1相同,以為(2)中說明已經保證一致了)

接下來的處理只需要將這兩個時間段取出來就可以了:

select a.tname, a.y, b.y1

from cte a, cte b

where a.id = b.id - 1

and a.y <> b.y1

此部分保證了編號的連續性,並且要判斷y和y1不相同,相同的話就是一年,並不是連續的幾年。

結果如下:

在:《oracle查詢優化改寫技巧與方案》中還有另外一種方法,使用到了聚合函式

此函式根據聚合函式group by的分組策略將同一組的資料以逗號為分隔符,拼接到一行

原始資料

其中 replace函式將逗號替換為空

查詢結果:

Oracle的find in set 函式的使用

相信大家都知道mysql 的find in set 函式的使用。這裡也大概重新講一下 mysql手冊中find in set函式的語法 find in set str,strlist str 要查詢的字串 strlist 欄位名 引數以 分隔 如 1,2,6,8 查詢字段 strlist 中包含 s...

Oracle的row number函式的使用

oracle提供的row number 函式可以實現加rownum的作用,並且可以根據字段值的分類,在同類中進行排序 select id,name,class id,score,row number over partition by class id order by score desc fro...

oracle查詢應用小技巧收集

第乙個小知識點 clear 在oracle中也可以用以清除螢幕上的內容 第二個小知識點 在乙個表中插入自身的查詢結果 insert into my table id,name,age select id,name,age from my table 第三個小知識點 oracle中null 不能進行運...