首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接两个具有不同详细程度的表,并删除重复的值

问连接两个具有不同详细程度的表,并删除重复的值
EN

Stack Overflow用户
提问于 2021-03-30 03:50:16
回答 2查看 48关注 0票数 0

我有两张表:

Table1 (ID1,ID2,PERIOD,VALUE1)

代码语言:javascript
复制
WITH Table1 (ID1, ID2, PERIOD, VALUE1) AS (
SELECT 1,   'A', '202101',   100  FROM DUAL UNION ALL
SELECT 1,   'A', '202102',   200  FROM DUAL UNION ALL
SELECT 1,   'A', '202103',   300  FROM DUAL UNION ALL
SELECT 1,   'A', '202104',   400  FROM DUAL UNION ALL
SELECT 2,   'A', '202101',   500  FROM DUAL UNION ALL
SELECT 2,   'A', '202102',   600  FROM DUAL UNION ALL
SELECT 2,   'A', '202103',   700  FROM DUAL UNION ALL
SELECT 2,   'A', '202104',   800  FROM DUAL 

Table2 (ID2,PERIOD,VALUE2)

代码语言:javascript
复制
WITH Table2 (ID2, PERIOD, VALUE2) AS (
SELECT 'A', '202101',   11  FROM DUAL UNION ALL
SELECT 'A', '202102',   12  FROM DUAL UNION ALL
SELECT 'A', '202103',   13  FROM DUAL UNION ALL
SELECT 'A', '202104',   14  FROM DUAL 

in没有按顺序排列,并且不是递增的。我想在ID2上连接这两个表,并且在给定的时间段内只获取一次Value2值。如何替换具有相同ID2的多个ID1条目的所有重复项?

我当前的输出如下所示:

代码语言:javascript
复制
ID1   ID2   PERIOD    Value1   Value2
-------------------------------------
1     A     202101    100      11
1     A     202102    200      22
1     A     202103    300      33
1     A     202104    400      44
2     A     202101    500      11
2     A     202102    600      22
2     A     202103    700      33
2     A     202104    800      44

我想要的输出将如下所示:

代码语言:javascript
复制
ID1   ID2   PERIOD    Value1   Value2
-------------------------------------
1     A     202101    100      11
1     A     202102    200      22
1     A     202103    300      33
1     A     202104    400      44
2     A     202101    500      null
2     A     202102    600      null
2     A     202103    700      null
2     A     202104    800      null
EN

回答 2

Stack Overflow用户

发布于 2021-03-30 04:24:22

嗯,假设id1定义了行上的相关顺序,一种方法是在ON子句中使用NOT EXISTS检查给定的id1是否存在较低的period。

代码语言:javascript
复制
SELECT t11.id1,
       t11.id2,
       t11.period,
       t11.value1,
       t21.value2
       FROM table1 t11
            LEFT JOIN table2 t21
                      ON t21.id2 = t11.id2
                         AND t21.period = t11.period
                         AND NOT EXISTS (SELECT *
                                                FROM table1 t12
                                                WHERE t12.period = t11.period
                                                      AND t12.id1 < t11.id1);

另一种类似的方法是使用相关子查询来获取该时间段的最小id1。

代码语言:javascript
复制
SELECT t11.id1,
       t11.id2,
       t11.period,
       t11.value1,
       t21.value2
       FROM table1 t11
            LEFT JOIN table2 t21
                      ON t21.id2 = t11.id2
                         AND t21.period = t11.period
                         AND t11.id1 = (SELECT min(t12.id1)
                                               FROM table1 t12
                                               WHERE t12.period = t11.period);

db<>fiddle

看看哪一个在您的环境中表现得更好。

票数 0
EN

Stack Overflow用户

发布于 2021-03-30 06:10:11

您可以使用窗口函数枚举值。然后将其包含在join中

代码语言:javascript
复制
select t1.*, t2.*
from (select t1.*,
             row_Number() over (partition by id2, period order by id1) as seqnum
      from table1 t1
     ) t1 left join
     table2 t2
     on t2.id2 = t1.id2 and t2.period = t1.period and t1.seqnum = 1;

Here是一个db<>fiddle。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66860718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档