【问题标题】:How to union a data set with a specific rule如何将数据集与特定规则联合
【发布时间】:2021-03-31 17:30:03
【问题描述】:

我有两个几乎相同的数据集,我正在尝试合并,但我只想在文件 1 中还没有日期的情况下合并它们。

数据集 1

File Date Type
1 1/1/2020 a
1 1/2/2020 b
1 1/3/2020 c

数据集 2

File Date Type
2 1/1/2020 a
2 1/2/2020 b
2 1/3/2020 c
2 1/4/2020 d

理想输出

File Date Type
1 1/1/2020 a
1 1/2/2020 b
1 1/3/2020 c
2 1/4/2020 d

如果两个数据集的日期相同,那么我只想使用文件 #1 中的数据

SELECT FILE, DATE, TYPE FROM TABLE A
UNION
SELECT FILE, DATE, TYPE FROM TABLE B

[设置]https://www.db-fiddle.com/f/whfZGwnAJcAYaQii6avF6k/1

【问题讨论】:

    标签: sql datetime union snowflake-cloud-data-platform full-outer-join


    【解决方案1】:

    您正在描述full join。 Popeye 的答案有效,并且是不支持语法的数据库中的典型方法。但是Snowflake does,所以查询更简单,更有效地表述为:

    select coalesce(t1.file, t2.file) as file, date, coalesce(t1.type, t2.type) as type
    from t1
    full outer join t2 using (date)
    

    【讨论】:

    • 如果有 10 多列,是否有更简单的方法来执行此操作,或者我必须在每列和别名周围包裹合并?
    • @andaman:不,你需要coalesce()。
    【解决方案2】:

    您可以将union all 与not exists 一起使用,如下所示:

    SELECT DISTINCT FILE, DATE, TYPE FROM TABLEA
    UNION
    SELECT DISTINCT FILE, DATE, TYPE FROM TABLEB B
    WHERE NOT EXISTS 
    (SELECT 1 FROM TABLEA A
      WHERE A.DATE = B.DATE
        AND A.TYPE = B.TYPE) 
    

    注意:我使用distinct 使逻辑类似于 union,因为它删除了重复项。如果您的各个表中没有重复项,您可以从查询中删除 distinct。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2015-08-10
      相关资源
      最近更新 更多