如何基于列值生成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的主要内容,如果未能解决你的问题,请参考以下文章

如何计算与 R 中相同列值关联的两个行值的差异?

Spark:基于列值的行过滤器

SQL中基于Common ID的列值组合

基于列值从存储过程调用视图

C# DataTable -> 需要根据列值生成一个ID

Python生成唯一ID----UUID