如何基于列值生成ID
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何基于列值生成ID相关的知识,希望对你有一定的参考价值。
我将尽力提供示例和代码。假设[CycleStart]和[CycleEnd]数据类型之外的所有数据都是Varchar,在这个阶段,我对此不太担心。
表A由以下RAW示例数据组成:
+-------+---------+----------------+------------+------------+
| JobID | JobName | CycleDesc | CycleStart | CycleEnd |
+-------+---------+----------------+------------+------------+
| 10003 | Run1 | January 2019 | 31/12/2018 | 31/12/2018 |
| 10005 | Run2 | December 2018 | 31/12/2017 | 31/11/2018 |
| 10006 | Run3 | March 2019 | 31/12/2018 | 31/02/2019 |
| 10007 | Run4 | September 2019 | 31/12/2018 | 31/09/2019 |
| 10008 | Run5 | November 2019 | 31/12/2018 | 31/10/2019 |
+-------+---------+----------------+------------+------------+
表B由以下示例数据组成,用于生成此数据的代码如下:
+-------+---------+---------+
| JobID | PeriodID | Entity |
+-------+---------+---------+
| 10003 | 202101 | XYZ1 |
| 10003 | 202112 | XYZ2 |
| 10007 | 202008 | XYZ3 |
| 10007 | 202003 | XYZ4 |
| 10008 | 201904 | XYZ5 |
+-------+----------+--------+
Declare @Counter3 INT
SELECT @Counter3=1
WHILE @Counter3 <= 1000
BEGIN
INSERT INTO [dbo].[TableB]
SELECT
FLOOR(RAND()*(33979-1+1))+1 [JobID]
,CAST(ROUND(((2021 - 2019 -1) * RAND() + 2020), 0) AS VARCHAR) + RIGHT('0'+CAST(FLOOR(RAND()*(12-1+1))+1 AS VARCHAR),2) [PeriodID]
,FLOOR(RAND()*(23396-1+1))+1 [Entity]
问题出在表B列[PeriodID]中。此列表示从表A中的[CycleStart]生成的ID,例如31/12/2018 = 201812(YYYYMM)。
我想在表B]中显示的是每个作业ID的期间ID,但显示为[[EACH月份+ [CycleStart]日期之前的30年。我要实现的示例表:+-------+---------+---------+
| JobID | PeriodID | Entity |
+-------+---------+---------+
| 10006 | 201812 | XYZ1 |
| 10006 | 201901 | XYZ2 |
| 10006 | 201902 | XYZ3 |
| 10006 | 201903 | XYZ4 |
| 10006 | 201904 | XYZ5 |
| 10006 | 201905 | XYZ5 |
| 10006 | 201906 | XYZ5 |
| 10006 | 201907 | XYZ5 |
| ... | +30yrs | ... |
| 10006 | 204812 | XYZ5 |
+-------+----------+--------+
我该如何实现?目前,我只是随机生成与[CycleStart]日期不相关的ID,因此仅使我的数据倾斜,但这是我想到的唯一方法。
我将尽力提供示例和代码。假设[CycleStart]和[CycleEnd]数据类型之外的所有数据都是Varchar,在这个阶段,我对此不太担心。表A由...
如果有此表,则只需要加入此表即可。
以上是关于如何基于列值生成ID的主要内容,如果未能解决你的问题,请参考以下文章