2017-06-13 61 views
0

我有下面的表格,我做了很簡單的表格,因爲我不知道如何將它格式化爲表格(請注意,如果有人可以將我鏈接到一個簡單的教程,將永遠感激)。Increment Row_Number Only Where Distinct

id 
1 
1 
1 
2 
2 
2 

我想補充這遞增只在不同的ID號的另一列這樣的結果應該是

Id 
1 
1 
1 
2 
2 
2 

rowNum 
1 
1 
1 
2 
2 
2 

目前,所有我能設法得到的是:

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

我錯過了一些很簡單的事情,因爲我相信我應該能夠使用row_number或rank和窗口函數來解決這個問題,但我無法弄清楚。

回答

2

使用DENSE_RANK()而不是ROW_NUMBER()

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

Demo

+0

那是它!在這種情況下,這不會被視爲一個窗口函數,那麼正確嗎?只想知道,所以我將在未來得到我的術語。 – MPJ567

+1

'DENSE_RANK()'實際上是一個窗口函數。每當你看到'OVER'時,你應該閱讀「窗口功能」。看看[這裏](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) 

而另一種方式:

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 –