mysql5.7 mysql8窗口函數(shù)分組排序并在組內(nèi)編號(hào)

表結(jié)構(gòu)

create table biz_tag
(
    id bigint unsigned auto_increment comment '主鍵' primary key,
    tag_name varchar(128) default '' not null comment '標(biāo)簽',
    category varchar(10) default '' not null comment '分類',
    create_by varchar(20) default '' not null comment '創(chuàng)建人'
)

mysql8

select  id, ROW_NUMBER() OVER (PARTITION BY category ORDER BY id) AS idx, category, tag_name
from biz_tag
where create_by = 'sys'
;

ROW_NUMBER() OVER (PARTITION BY category ORDER BY id) AS idx
含義: 按 category 分組, 組內(nèi)按 id 排序, 組內(nèi)排序的序號(hào)(行號(hào))作為列 idx

image.png

mysql5.7

ROW_NUMBER() 在 mysql8 才開(kāi)始支持, 對(duì)于msqyl5.7或?qū)?yīng)版本的MariaDB,相同功能的實(shí)現(xiàn)可以參考如下 sql

select  id, @rn:= (IF(@category = category, @rn + 1, 1)) as idx, @category:=category as category, tag_name
from (select category,id,tag_name from biz_tag where create_by = 'sys' order by category, id) a
   , (select @rn:=0,@category:='') b
;

要點(diǎn):

  • a 表的 order by 必須先 category, 后 id
  • IF語(yǔ)句表示, 如果當(dāng)前行的 category 與變量 @category相同, 那么, 變量@rn加1,否則,@rn設(shè)置為1
  • @category:=category as category 必須在 (IF(@category = category, @rn + 1, 1))之后, 否則,判斷時(shí) 變量@category 的取值是不對(duì)的,結(jié)果也就不對(duì)了
image.png

可以看到,兩個(gè)結(jié)果,在分組變化的地方,idx開(kāi)始了重新編號(hào),且結(jié)果與 ROW_NUMBER() 一致.

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容