如何基于Table2序列为Table1每条CRSE_ID记录关联对应ITEM_TYPE
解决Table1与Table2的映射需求
先明确我们的数据源和目标要求:
原始数据表
Table1(课程信息表)
| SETID | CRSE_ID | COMPONENT | CAMPUS |
|---|---|---|---|
| A | 10001 | LAB | C1 |
| A | 10002 | LEC | C1 |
| A | 10003 | LAB | C1 |
| A | 10004 | LAB | C1 |
Table2(物品信息表)
| SETID | ITEM | TYPE | DESCR | CAMPUS |
|---|---|---|---|---|
| A | 300000220010 | Book | C1 | C1 |
| A | 300000220020 | Book | C2 | C2 |
| A | 300000220030 | Book | C1 | C1 |
| A | 300000220040 | Book | C2 | C2 |
| A | 300000220050 | Book | C1 | C1 |
| A | 300000220060 | Book | C2 | C2 |
| A | 300000220070 | Book | C1 | C1 |
需求拆解
- 将Table2中的
ITEM(推测你说的ITEM_TYPE是笔误,对应Table2的ITEM字段)映射到Table1的每一行,每个CRSE_ID对应递增序列的ITEM - 限定Table1中
CAMPUS为C1的行,必须匹配Table2中以奇数结尾且CAMPUS为C1的ITEM
实现方案(以SQL为例)
我们可以通过给两个表分别生成排序后的行号,再通过行号关联来完成映射:
WITH ranked_courses AS ( -- 给Table1的C1课程按CRSE_ID排序生成行号 SELECT SETID, CRSE_ID, COMPONENT, CAMPUS, ROW_NUMBER() OVER (ORDER BY CRSE_ID) AS course_rank FROM Table1 WHERE CAMPUS = 'C1' ), ranked_items AS ( -- 筛选Table2中C1且以奇数结尾的ITEM,按ITEM排序生成行号 SELECT SETID, ITEM, CAMPUS, ROW_NUMBER() OVER (ORDER BY ITEM) AS item_rank FROM Table2 WHERE CAMPUS = 'C1' AND RIGHT(ITEM, 1) % 2 = 1 -- 确保ITEM以奇数结尾,这里Table2的C1数据天然符合,可根据实际情况保留 ) -- 通过行号关联完成映射 SELECT rc.SETID, rc.CRSE_ID, rc.COMPONENT, rc.CAMPUS, ri.ITEM AS MAPPED_ITEM FROM ranked_courses rc JOIN ranked_items ri ON rc.course_rank = ri.item_rank AND rc.SETID = ri.SETID;
最终映射结果
| SETID | CRSE_ID | COMPONENT | CAMPUS | MAPPED_ITEM |
|---|---|---|---|---|
| A | 10001 | LAB | C1 | 300000220010 |
| A | 10002 | LEC | C1 | 300000220030 |
| A | 10003 | LAB | C1 | 300000220050 |
| A | 10004 | LAB | C1 | 300000220070 |
补充说明
- 若Table2中存在C1但不以奇数结尾的
ITEM,ranked_items中的RIGHT(ITEM, 1) % 2 = 1条件会自动过滤这些数据 - 映射的递增顺序由
CRSE_ID和ITEM的排序规则决定,可根据需求调整ORDER BY后的字段
内容的提问来源于stack exchange,提问作者Rohit Prasad
相关产品推荐
相关产品推荐

