我有一个客户提供的数据集,如下所示:(简化)
|ForiegnKey|Code1|Code2|Code3|
|==========|=====|=====|=====|
|A |10 |20 |30 |
|A |10 |20 |30 |
|B |100 |200 | |
|C |25 |35 |40 |
|D |1000 | | |
|E | | |9999 |
对于最终产品,我需要一次在新表中输入1个代码,如下所示:
|ForiegnKey|Sequence|Code|
|A |1 |10 |
|A |2 |20 |
|A |3 |30 |
|B |1 |100 |
|C |1 |25 |
|C |2 |35 |
|C |3 |40 |
|D |1 |1000|
|E |1 |9999|
对于我的问题,是否有一种简单的方法可以在不涉及使用联合的查询中执行此操作? 我必须根据ForiegnKey的值生成序列号(即在ForiegnKey E的情况下,即使它在列Code3中,我需要它的序列为1.)我当前的思路是如果我可以在不使用Union的情况下将其从表中取出,我可以在同一语句中生成序列ID 应跳过空代码值,例如D-2和3以及E-1和2 我已经开始使用临时表来处理这个问题,但我想我会在这里查看是否有更简单的方法。
由于
答案 0 :(得分:3)
你觉得在一批中获得结果比避免使用UNIONS更感兴趣。你走了:
set @last_key = null;
set @seq = 1;
select foreignkey, case when @last_key is null or @last_key != foreignkey then @seq := 1 else @seq := @seq + 1 end as sequence, code, @last_key := foreignkey as foo from (
select foreignkey, code1 as code
from dataset
where code1 is not null
union
select foreignkey, code2
from dataset
where code2 is not null
union
select foreignkey, code3
from dataset
where code3 is not null
order by 1
) foo;