sql 差值 SQL 去掉分割符並重排序

2021-10-11 23:03:00 字數 1836 閱讀 5927

這是群友在工作中碰到的乙個需求。有一張表 x (id,name),資料如下圖中的左半部分,他希望通過 sql 獲取到圖中右半部分呈現的結果。

左表變換成右表的規則如下:

去掉 name 列中的「/」,保持 name 列中的資料的相對順序不變;

重新生成序號(即 id 列),序號從 1 開始遞增;

生成 name 列中每個值對應的組號,被「/」分隔的且序號連續的為一組,組號也是從 1 開始。

右表的 id 列和 name 列的結果很容易轉換得到。

select 

row_number() over() as id,

name 

from

xwhere name <> '/' 

order by id 

執行結果 >>>

id  name    

------  --------

1  a       

2  b       

3  c       

4  d       

5  e       

6  f       

7  g       

8  h       

怎麼知道哪些資料屬於同一組呢?去掉「/」後原始序號連續的就是同一組。那怎麼用 sql 來表示呢?

我們先來看原始序號和新序號之間的聯絡 >>>

name    原始序號  新序號  差值  

------  ------  ------  --------

a            2       1         1

b            3       2         1

c            4       3         1

d            6       4         2

e            7       5         2

f            9       6         3

g           10       7         3

h           11       8         3

可以看出,有一批資料的【原始序號-新序號】的結果相同,而這批資料正好是同一組資料。因此,我們可以通過此方法找出每組資料。

需要注意的是,計算出來的差值並不能作為組號,而是要依據差值生成組號。

with x1 as 

(select 

*,row_number() over() as new_id 

from

xwhere name <> '/'),

x2 as 

(select 

b.new_id as id,

a.name,

a.id - b.new_id as margin 

from

x a 

inner join x1 b 

on b.id = a.id) 

select 

id,name,

dense_rank() over (order by margin) 

as `group`

from

x2 

我們使用視窗函式dense_rank()生成了組號。

封面由mohamed hassan在pixabay上發布 。

sql 分割字元

sql對字串的處理能力比較弱,比如我要迴圈遍歷象1,2,3,4,5這樣的字串,如果用陣列的話,遍歷很簡單,但是t sql不支援陣列,所以處理下來比較麻煩。下邊的函式,實現了象陣列一樣去處理字串。一,用臨時表作為陣列 create function f split c varchar 2000 spl...

sql業務分割

create function strtotable str varchar 1000 returns tablename table str2table varchar 50 as 該函式用於把乙個用逗號分隔的多個資料字串變成乙個表的一列,例如字串 1,2,3,4,5 將程式設計乙個表,這個表 b...

sql去掉特殊字元

update gz user gz set gz.address replace replace replace replace replace replace replace replace replace replace replace replace replace replace repla...