【问题标题】:Self joining table with a condition带条件的自联接表
【发布时间】:2017-07-30 02:27:23
【问题描述】:

我有以下类型的表:

表 dummy1:

e_n  t_s  item
a     t1   c
a     t2   c
a     t3   c
a     t4   c
b     p1   c
b     p2   c
b     p3   c 
b     p4   c

t1, t2, t3, t4, p1, p2, p3, p4 是按升序排列的时间戳。 t1、t2、t3、t4 是 event_name 'a' 的升序时间戳。 p1, p2, p3, p4 是 event_name 'b' 升序的时间戳。

c 是发生这些事件“a”和“b”的 item_number。

我正在尝试编写一个查询,其结果应如下所示:

e_n1 e_n2  item  t_s_1 t_s_2
a     b     c     t1    p1
a     b     c     t2    p2 
a     b     c     t3    p3
a     b     c     t4    p4

我已经尝试了以下代码:

select l.e_n as e_n_1, m.e_n as e_n_2, l.item, l.t_s as t_s_a, 
m.t_s as t_s_b from (
(select * from  dummy where e_n = 'a') l 
join 
(select * from  dummy where e_n = 'b') m 
on l.item = m.item and l.t_s < m.t_s

连接 l.item = m.item 是必需的,因为还有许多其他项目 c1、c2、c3 具有相同的结构

结果是:

   e_n1 e_n2  item  t_s_a t_s_b
    a     b     c     t1    p1
    a     b     c     t1    p2
    a     b     c     t1    p3
    a     b     c     t1    p4
    a     b     c     t2    p1 
    a     b     c     t2    p2
    a     b     c     t2    p3

so on

我怎样才能以有效的方式实现我的结果?

【问题讨论】:

  • 你的 apache-spark-sql 是否支持 ROW_NUMBER() OVER (ORDER BY t_s) rn?如果是,那么只需使用l.rn = m.rn FULL OUTER JOIN 表lm
  • 这是专门针对 Amazon Redshift 的吗?还是适用于 Spark?您能否相应地澄清您的标签。
  • 这个用于 apache-spark-sql

标签: sql join apache-spark-sql


【解决方案1】:
select      min (case when e_n = 'a' then 'a' end)  as e_n1
           ,min (case when e_n = 'b' then 'b' end)  as e_n2
           ,item
           ,min (case when e_n = 'a' then t_s end)  as t_s_1
           ,min (case when e_n = 'b' then t_s end)  as t_s_2

from       (select      d.*
                       ,row_number () over (partition by item,e_n order by t_s) as rn

            from        dummy as d
            ) d

group by    item
           ,rn

+------+------+------+-------+-------+
| e_n1 | e_n2 | item | t_s_1 | t_s_2 |
+------+------+------+-------+-------+
| a    | b    | c    | t1    | p1    |
| a    | b    | c    | t2    | p2    |
| a    | b    | c    | t3    | p3    |
| a    | b    | c    | t4    | p4    |
+------+------+------+-------+-------+

【讨论】:

    【解决方案2】:

    首先,按每个事件的时间戳排序,然后加入排序后的表行号。

    试试下面的代码。

    select l.e_n as e_n_1, m.e_n as e_n_2, isnull(l.item,m.item) as item, l.t_s as t_s_a, 
        m.t_s as t_s_b from 
        (select *,(row_number() over (order by t_s)) as rn from  dummy where e_n = 'a') l 
        full join 
        (select *,(row_number() over (order by t_s)) as rn from  dummy where e_n = 'b') m 
        on l.item = m.item and l.rn=m.rn
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 2019-08-10
      • 1970-01-01
      • 2013-08-13
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多