mysql 實現類似開窗函式的功能

2022-02-13 03:04:54 字數 2031 閱讀 3905

mysql8 已經支援開窗函式 

sql server 的開窗函式

mysql8 之前的版本不支援開窗函式

目的,取每個channel 按created_on 倒序排的前20條

示例如下(有部分冗餘資料)

select

id,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...