Создайте число и повторяйте каждые пять клиентов в оракуле - PullRequest
0 голосов
/ 09 октября 2018

Как сгенерировать номер строки для каждых 5 клиентов в Oracle?Например, если число записей = 10, ожидаемый результат будет: 1..5,1..5

Примерно так:

CustomerName  Row Number  
A                 1  
B                 2  
C                 3  
D                 4  
E                 5  
F                 1  
G                 2  
H                 3  
I                 4  
J                 5

Ответы [ 6 ]

0 голосов
/ 09 октября 2018

это будет делать:

select e.*, mod(rownum-1,5)+1 rownumber
from (select * from table_name) e;
0 голосов
/ 09 октября 2018

В Oracle вы можете просто:

select t.*, 1 + mod(rownum - 1, 5) as rownumber
from t;

Вы также можете заменить rownum на row_number() over (order by . . . ).

0 голосов
/ 09 октября 2018

Мое решение использует ROW_NUMBER, чтобы присвоить значение каждой строке, а затем применяет функцию MOD, чтобы разделить его на 5.Хотя это работает, я думаю, что другое решение, использующее NTILE, является более чистым.

WITH cust AS
  (SELECT customername, ROW_NUMBER() OVER(ORDER BY customer_name) AS ordering
   FROM customers)
SELECT customername , CASE WHEN MOD(ordering,5) = 0 THEN 5 ELSE MOD(ordering,5) END AS bucket
  FROM cust;
0 голосов
/ 09 октября 2018

это тоже работает (оракул);измените это в соответствии с вашими потребностями

выберите

столбец данных "data",

rownum original_rownum,

replace (mod (rownum, 5), 0,5) Ожидаемый_кронум

от

ваш_таблик;

0 голосов
/ 09 октября 2018

одним из решений будет аналитическая функция NTILE: https://docs.oracle.com/database/121/SQLRF/functions127.htm#SQLRF00680

Она также хорошо подходит для случаев, когда количество клиентов не делится на 5 (например, 12 клиентов).

Образец:

with customers as (        
    select level customername from dual connect by level <= 10)
select customername, ntile(5) over (order by customername asc) rownumber
from customers;  
0 голосов
/ 09 октября 2018

Вы можете использовать модульную арифметическую логику , как показано ниже:

select "Customer Name", replace(mod(rn,5),0,5) "Row Number"
  from
(
  select CustomerName as "Customer Name", row_number() over (order by CustomerName) as rn
    from
  (
    select chr(level+64) CustomerName, level as nr
      from dual
     connect by level <= 10 
  )
);

Rextester Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...