我有两个数据集有六列:
如何获得下面提到的子数据集?
一个。记录完全匹配基于所有六列(上个月记录当前月份数据没有变化)
select * from a where (c1,c2,c3,c4,c5,c6) in (select c1,c2,c3,c4,c5,c6 from b );
湾基于所有六列(当前月份数据中的新记录)完全不匹配的记录。
℃。记录在任何一列中都有更改的列标识符。
d。记录在任何两列中都有更改的列标识符。
即记录在任何三列中都有更改的列标识符。
F。记录在任何四列中都有更改的列标识符。
克。记录在任何五列中都有更改的列标识符。
答案 0 :(得分:0)
psuedo编码,因为您了解详情。
Select case when a.c1 <> b.c1 then 1 else 0 end as c1
case when a.c2 <> b.c2 then 1 else 0 end as c2
...
case when a.c6 <> b.c6 then 1 else 0 end as c6
from a inner join b on a.recordid? = b.recordid?
我使用recordID?因为你的表中需要有一些与当月记录和过去一个月有关的东西
这会给你一个c1到c6列,如果它改变则为1,如果没有,则为0。把它变成子查询
select recordid? from
(Select recordid?,
case when a.c1 <> b.c1 then 1 else 0 end as c1
case when a.c2 <> b.c2 then 1 else 0 end as c2
...
case when a.c6 <> b.c6 then 1 else 0 end as c6
from a inner join b on a.recordid? = b.recordid?) a
where c1+c2+c3+c4+c5+c6 = x
X对齐您要问的问题以及更改了多少列。 x = 0没有变化。
从评论中加入。
我真的希望你没有太多行
select * from
(Select a.*, case when a.c1 <> b.c1 then 1 else 0 end as c1,
case when a.c2 <> b.c2 then 1 else 0 end as c2,
...
case when a.c6 <> b.c6 then 1 else 0 end as c6
from a inner join b on 1=1) a
where c1+c2+c3+c4+c5+c6 = 0
我们基本上删除了加入条件。这称为交叉连接,将在结果中生成此月份记录*上个月记录,然后将其过滤掉。 c1 + c2 + c3 + c4 + c5 + c6 = 0是精确匹配。 c1 + c2 + c3 + c4 + c5 + c6 = 1将发现6中的5个相同。等等。
你不希望这个模型持续很长时间......你可以更快地获得一些标准化数据。