【问题标题】:How do you join between two delta tables?你如何连接两个增量表?
【发布时间】:2014-08-05 05:07:54
【问题描述】:

我想知道是否有一种明显的方法可以连接我忽略的两个表。

如果将数据加载到表中以便只记录增量,如何将不同的表连接在一起?表之间没有明显的连接,因为不能保证日期在日期/键上匹配 1:1

给定以下简单的结构:

BeginDate | EndDate | Id | Col1 | Col2 ...

表 A 可能包含数据:

1/1/2014 | 1/7/2014  | 1 | A | i
1/7/2014 | 1/15/2014 | 1 | B | i

表 B 可能包含数据:

1/1/2014 | 1/3/2014  | 1 | ABCDEF | 123
1/3/2014 | 1/8/2014  | 1 | FEDCBA | 321
1/8/2014 | 1/15/2014 | 1 | QWERTY | 314

您将如何平等地加入这两个表?我目前的方法是首先将所有表格应用于日历,以生成每个日期的条目,然后在日期/键上加入这些结果,但这显然效率很低。

所需输出示例:

1/1/2014 | 1/3/2014  | 1 | A | i | ABCDEF | 123
1/3/2014 | 1/7/2014  | 1 | A | i | FEDCBA | 321
1/7/2014 | 1/8/2014  | 1 | B | i | FEDCBA | 321
1/8/2014 | 1/15/2014 | 1 | B | i | QWERTY | 314

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    我通过这个查询得到了想要的结果(注意 mysql 语法,你需要将最大/最小更改为 sql server 模拟)

    select greatest(a.begin,b.begin), least(a.end, b.end), a.*, b.*
    from table1 as a, table2 as b
    where
    a.begin <= b.end and a.end >= b.begin
    order by 1, 2
    

    【讨论】:

      【解决方案2】:

      您可以根据 2 个表的时间交集进行连接,例如

      SELECT 
          CASE WHEN t1.dt1 >= t2.dt1 THEN t1.dt1 ELSE t2.dt1 END AS dtStart,
          CASE WHEN t1.dt2 >= t2.dt2 THEN t1.dt2 ELSE t2.dt2 END AS dtEnd,
          t1.col1 t1Col1,
          t2.col1 t2Col1,
          t1.col2 t1Col2,
          t2.col2 t2Col2,
          t1.id t1ID,
          t2.id t2ID
      FROM dbo.TestTable t1
      JOIN dbo.TestTable2 t2 ON
       (t1.dt1 >= t2.dt1 AND t1.dt2 <= t2.dt2)
           OR (t2.dt1 >= t1.dt1 AND t2.dt2 <= t1.dt2)
      

      【讨论】:

        猜你喜欢
        • 2016-03-19
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        • 2018-02-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多