2017-06-02 2 views
3

結果セット内で増分カウンタを取得しようとしています。例えばグループ内でのカウントの増分By

、私はmessagesテーブルを持っていると仮定します。専用の内

+---------+------------+-------------+---------+ 
| user_id | message_id | sent_at  | counter | 
+---------+------------+-------------+---------+ 
|  1 |   1 | 2017-01-01 |  1 | 
|  1 |   3 | 2017-01-15 |  2 | 
|  1 |   4 | 2017-01-22 |  3 | 
|  2 |   2 | 2017-01-06 |  1 | 
|  2 |   6 | 2017-01-22 |  2 | 
|  3 |   5 | 2017-01-22 |  1 | 
|  3 |   7 | 2017-01-28 |  2 | 
|  3 |   8 | 2017-02-03 |  3 | 
|  3 |   9 | 2017-02-14 |  4 | 
+---------+------------+-------------+---------+ 

基本的に、カウンタが増加:

messages 
-------- 
- id (int) 
- user_id (int) 
- sent_at (date) 
- body (text) 

私は私がこのような結果得られたクエリを実行したいのですがuser_idグループ、および各内部グループはsent_at列で並べ替えられます。

私は簡単に以下のSQLで最初の3つの列を得ることができることを知っている:

SELECT 
    user_id, 
    id AS message_id, 
    sent_at 
FROM messages 
ORDER BY 
    user_id, 
    sent_at 

しかし、私はその第四count列を必要としているんです。

私は結果の行数を取得するためにROW_NUMBER()を使用できることを知っている:

SELECT 
    user_id, 
    id AS message_id, 
    sent_at, 
    ROW_NUMBER() OVER(ORDER BY user_id, sent_at) AS counter 
FROM messages 
ORDER BY 
    user_id, 
    sent_at 

をしかし、それは私に次のような結果与える:私はそれぞれの新しい後に何らかの形でカウンターをリセットすることができれば

+---------+------------+-------------+---------+ 
| user_id | message_id | sent_at  | counter | 
+---------+------------+-------------+---------+ 
|  1 |   1 | 2017-01-01 |  1 | 
|  1 |   3 | 2017-01-15 |  2 | 
|  1 |   4 | 2017-01-22 |  3 | 
|  2 |   2 | 2017-01-06 |  4 | 
|  2 |   6 | 2017-01-22 |  5 | 
|  3 |   5 | 2017-01-22 |  6 | 
|  3 |   7 | 2017-01-28 |  7 | 
|  3 |   8 | 2017-02-03 |  8 | 
|  3 |   9 | 2017-02-14 |  9 | 
+---------+------------+-------------+---------+ 

user_id、私は私が探している結果を得るだろう。あなたは、単にPARTITION BYを使用する必要が

答えて

5

SELECT 
    user_id, 
    id AS message_id, 
    sent_at, 
    ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY user_id, sent_at) AS counter 
FROM messages 
ORDER BY 
    user_id, 
    sent_at; 
+0

パーフェクト、感謝を! –

4

row_numberを使用して行くための正しい方法です。あなただけの各個別user_idのための新しいカウンタを取得するためにpartition by句が欠落している:あなたはpartition byを探している

SELECT 
    user_id, 
    id AS message_id, 
    sent_at, 
    ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY sent_at) AS counter 
    -- Here ----------^ 
FROM messages 
ORDER BY 
    user_id, 
    sent_at 
4

SELECT user_id, id AS message_id, sent_at, 
     row_number() over (partition by user_id order by sent_at) AS counter 
FROM messages m 
ORDER BY user_id, sent_at;