请教一个比较麻烦的 Oracle 转 Mysql 的问题

2022-10-01 12:00:37 +08:00
 darnurash

有一个 oracle 的 sql 要转写成 mysql 5.7 的写法,但是有几个分析函数很麻烦:

SELECT * FROM ( SELECT s.NAME , s.SUBJECT , s.SCORES , s.TERM , ROW_NUMBER() OVER (PARTITION BY SUBJECT ORDER BY SCORES DESC NULLS LAST ) AS rn, count(*) OVER (PARTITION BY SUBJECT ) AS rr, DENSE_RANK() OVER (PARTITION BY SUBJECT ORDER BY SCORES DESC) AS rd FROM SCORES s) FF WHERE FF.rn>2 AND FF.rr>2 AND FF.rd>2

 难点就是实现 ROW_NUMBER() ... NULLS LAST)、count(*) OVER...、DENSE_RANK() OVER
 请问有什么快捷的写法么?
2071 次点击
所在节点    MySQL
3 条回复
darnurash
2022-10-01 12:01:45 +08:00
建表语句:
CREATE TABLE "SCORES"
( "NAME" VARCHAR2(100),
"SUBJECT" VARCHAR2(100),
"SCORES" NUMBER(*,0),
"TERM" NUMBER(*,0)
)
c6h6benzene
2022-10-01 14:04:00 +08:00
从 Stackoverflow 看到的:

SELECT
(@row_number := @row_number + 1) AS rnk, points
FROM yourTable,
(SELECT @row_number := 0) AS x
ORDER BY points DESC;

至于 DENSE_RANK 大概你得自己写 join 根据 row_number 来判断了(或者丢到前端去)。
wxf666
2022-10-01 15:31:47 +08:00
为啥不用 MySQL 8.0 呢?

这些窗口函数连 SQLite 都已经在 4 年多前支持了。连 SQLite 都不如的,我觉得应该换了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/884184

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX