mysql5.7版本如何实现row_number()over()功能?

mysql5.7版本如何实现row_number()over()功能

参与4

1同行回答

匿名用户匿名用户
实现如下功能: row_number()over(partition by A order by B)SELECT a.sid ,a.score,-- a.cid , 不能有该字段,添加该字段,不能分组排序,是全局排序( @rank := CASE WHEN @cid = a.cid THEN @rank + 1 ELSE 1 END ) AS row_num, ( @cid := a.cid ) AS cid2 -- 字段中必须有字...显示全部

实现如下功能: row_number()over(partition by A order by B)

SELECT

a.sid ,

a.score,

-- a.cid , 不能有该字段,添加该字段,不能分组排序,是全局排序

( @rank := CASE WHEN @cid = a.cid THEN @rank + 1 ELSE 1 END ) AS row_num,

( @cid := a.cid ) AS cid2

-- 字段中必须有字段逻辑 ( @cid := a.cid ),否则不能实现分组排序;且分组字段必须在排序字段后面,否则是针对所有数据排序

FROM

(select

*

from

(

-- sid :学升;cid :课程编码; score :成绩

select '小明' sid,'cid-01' cid, 90 score union all

select '小明' sid,'cid-02' cid, 67 score union all

select '小明' sid,'cid-03' cid, 88 score union all

select '张三' sid,'cid-01' cid, 78 score union all

select '张三' sid,'cid-02' cid, 66 score union all

select '张三' sid,'cid-03' cid, 55 score union all

select '李四' sid,'cid-01' cid, 99 score union all

select '李四' sid,'cid-02' cid, 94 score union all

select '李四' sid,'cid-03' cid, 90 score

)t

ORDER BY cid, sid DESC

) as a

INNER JOIN ( SELECT @rank := 0, @cid := 0 ) AS b ON 1 =1

注意(重点!!!!):
select中必须有字段逻辑( @cid := a.cid ),否则不能实现分组排序;且分组字段a.cid 、@cid := a.cid必须在排序字段后面,否则是针对所有数据排序

收起
事业单位 · 2023-02-16
浏览679

ChatGPT 回答

MySQL 5.7版本中并没有内置的ROW_NUMBER() OVER()函数,但可以通过使用变量来模拟实现该功能。以下是一种实现方式:

SET @row_number:=0;
SELECT (@row_number:=@row_number+1) AS row_number, column1, column2, ...
FROM table_name
ORDER BY column1;

在这个例子中,我们首先设置一个变量@row_number并将其初始化为0。然后在SELECT语句中,我们使用该变量来模拟ROW_NUMBER()函数,并将其命名为row_number。最后,我们按照需要的列进行排序。

需要注意的是,这种方法只适用于单个表的情况,如果需要在多个表之间进行联接,可能需要使用其他方法来实现。

提问者

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2023-02-16
  • 关注会员:2 人
  • 问题浏览:1176
  • 最近回答:2023-02-16
  • X社区推广