Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当我达到某个数字时,如何对行重新编号?_Sql_Oracle_Row Number - Fatal编程技术网

Sql 当我达到某个数字时,如何对行重新编号?

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

我想为组中包含的所有项目创建两层行号集。例如,我想对一个州的所有城市进行编号,但将它们分成3组。最终结果如下所示:

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;