Sequentially number rows by keyed group in SQL?
Is there a way in SQL to sequentially add a row number by key group?
Assume a table with arbitrary (CODE,NAME) tuples. Example table:
CODE NAME
---- ----
A Apple
A Angel
A Arizona
B Bravo
C Charlie
C Cat
D Dog
D Doppler
D Data
D Down
Desired projection using CODE as the grouping attribute:
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
Thanks,
- SQL Server
- Oracle
- Postgres
- Sybase
- MySQL 8.0+
- MariaDB 10.2+
This covers most bases.
SELECT
CODE,
ROW_NUMBER() OVER (PARTITION BY CODE ORDER BY NAME) - 1 As C_NO,
NAME
FROM
MyTable
MySQL (and probably most other databases):
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;
Specific to 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 ;
Then, we can call:
CALL NumberRowsByGroup();
According to xaprb.com/blog post: how-to-number-rows-in-mysql, the second is faster.
精彩评论