一、組內排名(分組後進行排名)
1、排序開窗函式:
rank(),dense_rank(),row_number()
2、基本語法:
《排序函式》 over (partition by 《用於分組的列名》 order by 《用於排序的列名》),
如rank() over (partition by user_id order by score )
注意在寫rank(),dense_rank()時,其括號為空
3、三種排序開窗函式的區別:
考慮並列問題
(取自知乎網路)
二、求取top n內的資料
求出組內排名後,就可以輕鬆解決top n的問題,子查詢加上條件函式where,如下:
select * from
(select *, dense_rank() over(partition by 分組列 order by 排名列 desc)as 排名
from 各科成績表) as a
where 排名<=n;
三、相鄰間隔問題
如:sql,表user_pv_time中字段是user_id , user_time(使用者訪問時間),求每個使用者相鄰兩次瀏覽時間之差小於三分鐘的次數
方法一:
select a.user_id, count(*) as pv_count
from (select user_id, user_time,
row_number() over (partition by user_id order by user_time) as rn
from user_pv_time) as a
left join (select user_id, user_time,
row_number() over (partition by user_id order by user_time) as rn
from user_pv_time) as b
on a.user_id = b.user_id
where cast(b.rn as signed) - cast(a.rn as signed) = =1
and timestampdiff(minute, a.user_time, b.user_time) < 3
group by user_id
這裡用到了cast()函式和timestampdiff()函式,解釋如下:
方法二:
select t.user_id, count(*) as pv_count
from (select user_id, user_time,
lead(user_time, 1) over (partition by user_id
order by user_time) as next_time
from user_pv_time) as t
wfere timestampdiff(minute, user_time, next_time) < 3
group by user_id
這裡用到了lead()函式,分組中位於當前行後n行(lead為前函式,對應的還有後函式lag),該方法省去了多表鏈結的問題。
SQL CAST與CONVERT函式的用法
cast和convert函式都是sql 型別轉換函式,只是使用語法不同,且在時間轉換時convert函式具有style格式!支援轉換型別 例 1.select convert 23 signed 23 select cast 125e342.83 as signed 125 select cast ...
東軟實訓 SQL函式
sql是用於訪問和處理資料庫的標準的計算機語言,我們所使用的的是oracle sql 乙個資料庫通常包含乙個或多個表,每個表有乙個名字表示,下圖即為乙個名為 emp 的表,接下來的操作都將基於以下的表進行 字元函式 主要指引數型別是字元型,不同函式返回值可能是字元型或數值型 大小寫轉換 函式效果 結...
SQL工作常用函式 Oracle PLSQL
整體 示例 select from select airline,substr date,1 4 年,case when date between 2018 01 01 and 2018 08 31 then date else to char to date date yyyy mm dd 364...