簡體   English   中英

生成一個行號並在oracle中每五個客戶重復一次

[英]Generate a rownumber and repeat every five customers in oracle

如何在oracle中為每5個客戶生成一個行號? 例如,如果記錄數= 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

一種解決方案是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;  

您可以使用模塊化算術邏輯,如下所示:

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演示

在Oracle中,您可以執行以下操作:

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

您也可以將rownum替換為row_number() over (order by . . . )

這也適用(oracle); 根據您的需要更改

選擇

'data'data_column,

rownum original_rownum,

replace(mod(rownum,5),0,5)Expected_rownum

your_table;

我的解決方案使用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;

這將做:

select e.*, mod(rownum-1,5)+1 rownumber
from (select * from table_name) e;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM