2017-03-09 16 views
3

Iは、次のタイプのテーブルを持っている:自己条件でテーブルを結合

表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です。

私は次のように結果がどうあるべき対象のクエリを記述しようとしています

:ザ・はl.item = m.item参加

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 

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 

私は、次のコードを試してみました他の多くの項目の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 

結果を効率的に達成するにはどうすればよいですか?

+0

あなたのapache-spark-sqlサポートはROW_NUMBER()OVER(ORDER BY t_s)ですか?もしそうなら、 'l.rn = m.rn'を使ってFULL OUTER JOINテーブル' l'と 'm'を入力してください。 –

+0

Amazon Redshift専用ですか?それともスパークのためですか?それに応じてタグを明確にしてください。 –

+0

これはapache-spark-sqlのためのものです – SpaceOddity

答えて

3
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 | 
+------+------+------+-------+-------+ 
+0

答えを受け入れることを覚えています(** V **の印を付けて) –

0

まず、並べ替えタイムスタンプによってすべてのイベントのために、次にソートテーブルの行数に参加。

下記のコードを試してください。

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 
関連する問題