web-dev-qa-db-ja.com

SQLのキー付きグループごとに行に順番に番号を付けますか?

SQLに行番号を順番に追加する方法はありますかキーグループごとに

任意の(CODE、NAME)タプルを持つテーブルを想定します。表の例:

CODE NAME    
---- ----
A    Apple
A    Angel
A    Arizona
B    Bravo
C    Charlie
C    Cat
D    Dog
D    Doppler
D    Data
D    Down

グループ化属性としてCODEを使用した望ましい投影:

CODE C_NO NAME    
---- ---- ----
A    0    Apple
A    1    Angel
A    2    Arizona
B    0    Bravo
C    1    Charlie
C    0    Cat
D    0    Dog
D    1    Data
D    2    Down
D    3    Doppler

ありがとう、

16
Jé Queue

MySQLはAFAIKを行いません。これはほとんどの拠点をカバーしています。

SELECT
    CODE,
    ROW_NUMBER() OVER (PARTITION BY CODE ORDER BY NAME) - 1 As C_NO,
    NAME
FROM
    MyTable
35
gbn

MySQL(およびおそらく他のほとんどのデータベース):

select g.CODE
     , count(*)-1 as C_NO
     , g.NAME
from MyTable as g
  left join MyTable as o
    on g.CODE = o.CODE
      and g.NAME >= o.NAME
group by g.CODE
       , g.NAME;

MySQLに固有:

DELIMITER $$
CREATE PROCEDURE NumberRowsByGroup()
BEGIN
  SET  @code := 0;
  SET  @num := 0;
  SELECT CODE, C_NO, NAME FROM
    ( select q.CODE
           , q.NAME
           , @num := IF(q.CODE = @code, @num + 1, 0) as C_NO
           , @code := q.CODE as previous
      from yourTable q
      order by CODE
             , NAME
    ) as p
  ;
END$$
DELIMITER ;

次に、次のように呼び出すことができます。

CALL NumberRowsByGroup();

Xaprb.com/blogの投稿によると: how-to-number-rows-in-mysql 、2番目の方が高速です。

3
ypercubeᵀᴹ