admin

有什么方法可以用SQL生成当前年份的字母顺序

sql

我们如何编写可以生成“ Sequence_Code”的SQL函数,例如AA,AB,AC .... AZ。BA,BB,BC ....以及每个“
ID”的后两位数字“ Current_Year”的组合。按“ Record_Date”排序

例如:如果第一行的Current_Year是2019,则Sequence_Code应该是19AA。我的表是LoadData

序列码 ID 今年 记录日期
空值 310001 2019年 2019-01-01
空值 310002 2018年 2018-02-22
空值 310003 2020年 2020-02-20
空值 310004 2020年 2020-02-10

预期输出为:

序列码 ID 今年 记录日期
19AA 310001 2019年 2019-01-01
18AB 310002 2018年 2018-02-22
20AC 310003 2020年 2020-02-20
20AD 310004 2020年 2020-02-10

阅读 157

收藏
2021-07-01

共1个答案

admin

带有ROW_NUMBER()窗口函数和数学运算:

WITH cte AS (SELECT *, ROW_NUMBER() OVER (ORDER BY Record_Date) rn FROM LoadData)
SELECT RIGHT(Current_Year, 2) + 
       CHAR(ASCII('A') + rn / 26 + CASE rn % 26 WHEN 0 THEN -1 ELSE 0 END) + 
       CHAR(ASCII('A') - 1 + CASE rn % 26 WHEN 0 THEN 26 ELSE rn % 26 END) Sequence_Code,
       ID, Current_Year, Record_Date
FROM cte
ORDER BY rn

如果要更新Sequence_Code表的列:

WITH cte AS (SELECT *, ROW_NUMBER() OVER (ORDER BY Record_Date) rn FROM LoadData)
UPDATE cte
SET Sequence_Code = RIGHT(Current_Year, 2) + 
                    CHAR(ASCII('A') + rn / 26 + CASE rn % 26 WHEN 0 THEN -1 ELSE 0 END) + 
                    CHAR(ASCII('A') - 1 + CASE rn % 26 WHEN 0 THEN 26 ELSE rn % 26 END)

参见演示
结果:

> Sequence_Code |     ID | Current_Year | Record_Date
> :------------ | -----: | -----------: | :----------
> 18AA          | 310001 |         2018 | 2018-01-01 
> 19AB          | 310002 |         2019 | 2019-02-22 
> 20AC          | 310004 |         2020 | 2020-02-10 
> 20AD          | 310003 |         2020 | 2020-02-20
2021-07-01