web-dev-qa-db-ja.com

MySQLには、Oracleのようなdense_rank()やrow_number()のような関数はありますか?

MySQLには、Oracleや他のDBMSが提供するようなdense_rank()row_number()のような関数はありますか?

クエリ内でIDを生成したいのですが、MySQLにはこれらの関数がありません。代替手段はありますか?

8
CSiva

Mysqlにはそれらがありませんが、ユーザー定義変数を使用する次の式を使用してrow_number()をシミュレートできます。

_(@row := ifnull(@row, 0) + 1)
_

このような:

_select *, (@row := ifnull(@row, 0) + 1) row_number
from mytable
order by id
_

ただし、セッションを再利用する場合は、_@row_が引き続き設定されるため、代わりに次のようにリセットする必要があります。

_set @row := 0;
select *, (@row := @row + 1) row_number
from mytable
order by 1;
_

SQLFiddle を参照してください。

dense_rank()は可能ですが、列車事故です。その要件をアプリ層で処理することをお勧めします。

5
Bohemian

私たちは今持っています。

select ename, sal, dense_rank() over (order by sal desc)rnk
from emp2 e
order by rnk;
2
Ravi R

MySqlには、Oracleのようなdense_rank()またはrow_number()はありません。

ただし、SQLクエリを使用して同じ機能を作成できます。

これは同じことをしている記事です:

dense_rank()

row_number()

1
Praveen

MySQLはこれらの機能をサポートしていませんが、自分で模倣することができます。恥知らずに私のソリューションにリンクします MySQLのROW_NUMBER、RANK、DENSE_RANK関数

1
Kenneth Xu

DENSE_RANK()関数はMySQLバージョン8.0で使用できます。したがって、MySQLバージョン8.0を使用している場合は、このコマンドを実行できます。

SELECT name, DENSE_RANK() OVER ( ORDER BY value ) my_rank FROM table_name;
1
achmiral