Sql 当我达到某个数字时,如何对行重新编号?
我想为组中包含的所有项目创建两层行号集。例如,我想对一个州的所有城市进行编号,但将它们分成3组。最终结果如下所示:Sql 当我达到某个数字时,如何对行重新编号?,sql,oracle,row-number,Sql,Oracle,Row Number,我想为组中包含的所有项目创建两层行号集。例如,我想对一个州的所有城市进行编号,但将它们分成3组。最终结果如下所示: STATE | NUM1 | NUM2 | CITY ------------------------------------- NY | 1 | 1 | Albany NY | 1 | 2 | Buffalo NY | 1 | 3 | Syracuse NY | 2 | 1 | Rochester NY
STATE | NUM1 | NUM2 | CITY
-------------------------------------
NY | 1 | 1 | Albany
NY | 1 | 2 | Buffalo
NY | 1 | 3 | Syracuse
NY | 2 | 1 | Rochester
NY | 2 | 2 | Ithaca
。。。等等我想把NUM2限制在3,但是让NUM1尽可能高。我现在使用的是:
SELECT
STATE,
CITY,
ROW_NUMBER() OVER(PARTITION BY STATE ORDER BY CITY) AS CITY_NUM
FROM
T1
;
这是可以的,但是对于有很多“城市”的“州”,我得到了一些非常高的数字,并且希望所有的东西都能在三列中水平排列。有什么想法吗?只需使用整数算术:
SELECT STATE, CITY,
1 + FLOOR((ROW_NUMBER() OVER(PARTITION BY STATE ORDER BY CITY) - 1)/ 3) AS CITY_NUM_1,
1 + MOD(ROW_NUMBER() OVER(PARTITION BY STATE ORDER BY CITY) - 1, 3) AS CITY_NUM_2
FROM T1;
对于所需场景,对于测试数据,查询将按如下方式工作:
WITH TAB AS
(
SELECT 'NY' STATE, 'Albany' CITY FROM DUAL UNION
SELECT 'NY' STATE, 'Buffalo' CITY FROM DUAL UNION
SELECT 'NY' STATE, 'Syracuse' CITY FROM DUAL UNION
SELECT 'NY' STATE, 'Rochester' CITY FROM DUAL UNION
SELECT 'NY' STATE, 'Ithaca' CITY FROM DUAL UNION
SELECT 'IN' STATE, 'Mumbai' CITY FROM DUAL UNION
SELECT 'IN' STATE, 'Chennai' CITY FROM DUAL UNION
SELECT 'IN' STATE, 'Delhi' CITY FROM DUAL UNION
SELECT 'IN' STATE, 'Kolkatta' CITY FROM DUAL
)
SELECT STATE, CITY,
1 + FLOOR((ROW_NUMBER() OVER(PARTITION BY STATE ORDER BY CITY) - 1)/ 3) AS CITY_NUM_1,
1 + MOD(ROW_NUMBER() OVER(PARTITION BY STATE ORDER BY CITY) - 1, 3) AS CITY_NUM_2
FROM TAB;