我为不同的OEM设计了一些Vehicle Identification Number (VIN)解码器。关于VIN编号的事情......尽管有些标准化,但每个OEM都可以重载字符位置代码并对它们进行不同的处理,添加“额外”元数据(即指向VIN编号之外的更多数据的星号)等等。尽管如此所有这一切,我已经能够构建几个不同的OEM VIN解码器,现在我正在尝试构建一个GM VIN解码器,它让我头疼。
问题的关键在于GM根据车辆属性是卡车还是汽车,对车辆属性部分(位置4,5,6,7)的处理方式不同。这是细分:
通常我所做的是设计我自己的原始ETL
进程以将数据导入RDMBS - 每个表大致与主要的VIN细分相关联。例如,将有一个WMI表,EngineType表,ModelYear表,AssemblyPlant表等。然后我构建一个View,它连接一些上下文数据,这些数据可能或不能直接从VIN编号本身的字符代码中收集(例如,某些车型只有某些车辆发动机。)
要查找VIN,只需查询VIEW,即VIN字符串的每个主要字符代码位置细分。例如, 1FAFP53UX4A162757 的示例VIN在不同OEM的VIN结构中就像这样分解:
| WMI | Restraint | LineSeriesBody | Engine | CheckDigit | Year | Plant | Seq | | 123 | 4 | 567 | 8 | 9 | 10 | 11 | 12-17 | --------------------------------------------------------------------------------- | 1FA | F | P53 | U | X | 4 | A | ... |
通用汽车已经对此进行了调整......取决于它是汽车还是卡车,角色代码位置意味着不同的东西。
我的意思是 - 下面的每个ASCII表都与SQL表有些相关。 etc..
表示存在大量其他列式数据
以下是位置4,5(对应车辆线/系列)的示例。这些确实在一起,尽管上面说明了故障,但VIN源数据并没有真正区分位置4和5。
| Code (45)| Line | Series | etc.. -------------------------------------- | GA | Buick | Lacrosse | etc..
..和位置6对应体型
| Code (6) | Style | etc.. -------------------------------------- | 1 | Coupe, 2-Door | etc..
| Code (4) | GVWR | etc.. ------------------------------- | L | 6000 lbs | etc..
..和位置5,6(底盘/系列)现在意味着类似于乘用车的第4,5位:
| Code (56) | Line | Series | etc.. --------------------------------------- | RV | Buick | Enclave | etc..
我正在寻找一种在关系设计中解决这个问题的狡猾方法。我希望在解码VIN时返回一个通用结构 - 如果可能的话(即没有为汽车和卡车返回不同的结构)
答案 0 :(得分:1)
根据您对我是否可以使用其他值识别车辆类型的评论的回答,可能的方法是使用包含公共字段和2个详细信息表的主表,每个表都包含适当的字段汽车或卡车。
大致类似于以下内容(这里我猜WMI是PK):
主表
| WMI | Restraint | Engine | CheckDigit | Year | Plant | Seq |
| 123 | 4 | 8 | 9 | 10 | 11 | 12-17 |
汽车明细表
| WMI | Veh Line | Series | Body Type |
| 123 | 2 | 3 | 4 |
卡车明细表
| WMI | GWVR | Chassis |Body Type |
| 123 | 7 | 8 | 9 |
有了这个,您可以使用唯一的选择来检索所需的数据,如下所示:
Select *
From
(
Select M.*,
C.*,
Null GWVR,
Null Chassis,
Null Truck_Body_Type
From Master_Table M
Left Join Car_Table C
on M.WMI = C.WMI
Union
Select M.*,
Null Veh_Line,
Null Series,
Null Car_Body_Type
T.*
From Master_Table M
Left Join Truck_Table T
on M.WMI = T.WMI
)
对于DML SQL,您只需要在插入或更新句子之前进行控制,无论您是拥有汽车还是卡车型号。
当然,您需要确保每个主排只有一个细节,无论是在汽车明细表上还是在卡车详细信息表上。
HTH
答案 1 :(得分:0)
为什么不为解码定义这两个规则;只有一个会解析有效的结果。