2017-06-13 9 views
0

私は以下の表を持っています。私はここでテーブルとしてどのように書式を設定するのか分かりませんので、私は非常にシンプルにしました。永遠に感謝するだろう)。Increment Row_Number Only Distinct

id 
1 
1 
1 
2 
2 
2 

私は結果が

Id 
1 
1 
1 
2 
2 
2 

rowNum 
1 
1 
1 
2 
2 
2 

する必要がありますので、現在、私が取得するために管理することができ、すべてがあるだけの個別IDの数にインクリメント別の列を追加したい:

id 
1 
1 
1 
2 
2 
2 
rowNum 
1 
2 
3 
4 
5 
6 

私はrow_numberまたはランクとウィンドウ関数を使ってこの問題を解決できるはずですが、私はそれを理解することはできません。

答えて

2

使用DENSE_RANK()

SELECT 
    id, 
    DENSE_RANK() OVER (ORDER BY id) dr 
FROM yourTable 

Demo

+0

それだった!この場合、これはウィンドウ関数とは見なされませんが、正しいのでしょうか?ちょうど知りたいと思うので私は将来私の用語を真似します。 – MPJ567

+1

'DENSE_RANK()'は実際にはウィンドウ関数です。あなたが 'オーバー 'を見るときはいつでも、「ウィンドウ機能」を読むべきです。行番号と密度の高いランクを比較するための[こちら](https://stackoverflow.com/questions/11183572/whats-the-difference-between-rank-and-dense-rank-functions-in-oracle) 。 –

1

これはサブクエリ自己結合でも実行できます。

mysql> select id, 
> (select count(distinct id) 
> from 
> testtest b 
> where b.id < a.id) 
> from testtest a; 
+------+---------------------------------------------------------------+ 
| id | (select count(distinct id) from testtest b where b.id < a.id) | 
+------+---------------------------------------------------------------+ 
| 1 |                0 | 
| 1 |                0 | 
| 1 |                0 | 
| 2 |                1 | 
| 2 |                1 | 
| 2 |                1 | 
+------+---------------------------------------------------------------+ 
6 rows in set (0.01 sec) 

そして、もう一つの方法:代わりにROW_NUMBER()

select a.id, b.idRank 
from testtest a, 
    (
    select id, 
    rank() over 
     (order by id) as idRank 
    from (
     select distinct id 
     from testtest 
     ) testtest2 
    ) b 
where a.id = b.id 
+1

あなたの最初のクエリは、彼らの状況で、ウィンドウ関数の素敵な代替手段です利用できない可能性があります(MySQLなど)+1 –