

MySQL 5.6を利用しています。

分析関数を持たないRDBMSのSQLでは、どのようなSQLを書くのが一般的でしょうか？  
一般的ではなくとも、解決できるSQLがありましたら教えてください。  
よろしくお願いいたします。

やりたいこと：

下記のテーブルがあります。

[code]

    ユーザID 作成日時
    --------------------------
    10012   2015-01-04
    10010   2015-01-01
    10011   2014-01-15
    10010   2015-01-02
    10011   2015-12-09
    10010   2015-01-03
    10012   2015-11-01
    10011   2015-05-08
    10012   2015-01-03
    
[/code]

SQLで下記の結果を取得したいです。  
※「ユーザID」「作成日時」で昇順に並べかえて、  
グループ内（同じユーザID内）で通番を付与

[code]

    ユーザID 作成日時   グループ内通番
    -------------------------------
    10010   2015-01-01 1
    10010   2015-01-02 2
    10010   2015-01-03 3
    10011   2014-01-15 1
    10011   2015-05-08 2
    10011   2015-12-09 3
    10012   2015-01-03 1
    10012   2015-01-04 2
    10012   2015-11-01 3
    
[/code]


CC BY-SA 3.0
2015-06-23T16:51:29.460
11654
2016-04-28T03:15:07.327
2015-06-24T01:24:12.700
5778
9501
question
mysql sql
MySQLのSQLにてグループ内で連番を付けたい


MySQL だとユーザー変数で連番をつけたりします。

[code]

    set @no:=0;
    set @user_id:=null;
    
    select
      if(@user_id <> user_id, @no:=1, @no:=@no+1) as no,
      @user_id:=user_id as user_id,
      created_at
    from t order by user_id, created_at
    
[/code]

MySQL 特有の機能を使わないのであれば、次のように相関サブクエリを使うとかでしょうか。

[code]

    select
      t1.user_id, t1.created_at, (
        select count(*) from t t2
          where t1.user_id = t2.user_id
            and t1.created_at >= t2.created_at
      ) as no
    from t t1
    order by
      t1.user_id, t1.created_at
    
[/code]

（同値があるときの結果がちょっと変わりますが）

そのテーブルの主キーが `id` だとして、次のようにただのサブクエリでもいいかもしれません。

[code]

    select
      t1.user_id,
      t1.created_at,
      sum(t1.created_at >= t2.created_at) as no
    from t t1 inner join t t2 on t1.user_id = t2.user_id
    group by t1.id, t1.user_id, t1.created_at
    order by t1.user_id, no
    
[/code]


CC BY-SA 3.0
2015-06-24T03:31:35.723
11661
2016-03-16T00:53:31.553
2016-03-16T00:53:31.553
2494
2494
11654
answer


ngyukiさんが投稿されてる  
ユーザ変数を使う方法ですが

MySQLのマニュアルと  
OracleACEのAketiJyuuzouさんとyoku0825さんと  
日本オラクルの木村明治さんによると  
MySQLのユーザ変数は評価順序が未定義です。  
<http://qiita.com/AketiJyuuzou/items/cced9b70cc714b382d98>

なので結果が保証されません。


CC BY-SA 3.0
2016-04-28T01:35:19.183
24402
2016-04-28T03:15:07.327
2016-04-28T03:15:07.327
15293
15293
11654
answer