mysql8 已經支援開窗函式
sql server 的開窗函式
mysql8 之前的版本不支援開窗函式
目的,取每個channel 按created_on 倒序排的前20條
示例如下(有部分冗餘資料)
selectid,url,channel,created_on,rank
from
(
select
id,url,channel,created_on,rank
from (select article_tmp.id,url,article_tmp.channel,article_tmp.created_on,@rownum:=
@rownum+1
,
if(@pdept
=article_tmp.channel,@rank:=
@rank
+1,@rank:=
1) as
rank,
@pdept:=
article_tmp.channel
from
(
select
id,url,channel,created_on
from article order
by channel asc ,created_on desc
) article_tmp ,
(select
@rownum :=
0 , @pdept :=
null ,@rank:=
0) a
) result
)t where rank<=
20;
最核心的部分是
select article_tmp.id,url,article_tmp.channel,article_tmp.created_on,@rownum:=@rownum+1
,
if(@pdept
=article_tmp.channel,@rank:=
@rank
+1,@rank:=
1) as
rank,
@pdept:=
article_tmp.channel
from
(
select
id,url,channel,created_on
from article order
by channel asc ,created_on desc
) article_tmp
原理是按channel 和 created_on 排序
兩個臨時變數
pdept
rank
pdept 指向channel
游標(這麼說不準確,就是個遍歷的過程)下移的過程中
pdept 未變,則rank++
若pdept 變化,則表示是新的channel rank歸0
最後按取rank 的top n條資料 即可
select article_tmp.id,url,article_tmp.channel,article_tmp.created_on,@rownum:=@rownum+1
,
if(@pdept
=article_tmp.channel,@rank:=
@rank
+1,@rank:=
1) as
rank,
@pdept:=
article_tmp.channel
from
(
select
id,url,channel,created_on
from article order
by channel asc ,created_on desc
) article_tmp
mysql 開窗函式 累加 mysql實現開窗函式
學習過oracle的應該知道,oracle中的分析函式功能十分強大,包括mssql postgresql等資料庫都支援開窗函式。然而mysql至今都沒有提供這樣的功能,今天就來 下用mysql實現一些開窗功能需求。實驗資料 表sale month user id amount 201601 1 50...
mysql實現開窗函式
mysql實現開窗函式 學習過oracle的應該知道,oracle中的分析函式功能十分強大,包括mssql postgresql等資料庫都支援開窗函式。然而mysql至今都沒有提供這樣的功能,今天就來 下用mysql實現一些開窗功能需求。實驗資料 表sale month user id amount...
MySql實現ROW NUMBER 開窗函式
本文咱們使用mysql實現開窗函式row number over partition by order by 廢話不多說,直接開幹 準備資料select from test biz policy policy platform id 平台id publish time 政策發布時間 policy n...