2017-11-08 16 views
0

ため、重複する値を含む行を除外:(最初の行はヘッダである)ハイブSQL:私は、次のデータとのハイブテーブルを持っている特定の列

session,ts,status,color 
a,1,new,red 
a,2,check,blue 
a,3,new,green 
a,4,amount,blue 
a,5,end,blue 
b,1,new,red 
b,2,bottle,blue 
b,3,end,blue 
c,4,check,blue 

IトラブルそのSQLクエリを書き込むことを抱えています次の基準を満たしています。 1)ステータスがnewのセッションのすべての行。 2)セッションが新しいステータス=ためmultilpe値が含まれている場合、最初のものだけ

出力

a,1,new,red 
a,2,check,blue 
a,4,amount,blue 
a,5,end,blue 
b,1,new,red 
b,2,bottle,blue 
b,3,end,blue 

a,3,new,greenc,4,check,blueが省略されているであろう取り除きます。

私はあなただけ sessiontsstatusの列を見ている場合は確かにトリックを行うんが、それはそれ

にグループ・バイを持っているとして、私は2番目のクエリを好きではないこのクエリを書いている

select session, ts, status from mp_logon3 
where status!='new' 
and session in (select distinct a.session from mp_logon3 a 
where a.status = 'new' 
) 
union 
select session, min(ts), status from mp_logon3 
where status='new' 
and session in (select distinct b.session from mp_logon3 b 
where b.status = 'new' 
) 
group by session, status 

ただし、color列を追加するとすぐに、それは分解されます。 (あなたは、セッション= Aとステータス=新しいのための両方の行を取得します。緑の一つと赤のための1つ。

select session, ts, status, flavor from mp_logon3 
where status!='new' 
and session in (select distinct a.session from mp_logon3 a 
where a.status = 'new' 
) 
union 
select session, min(ts), status, flavor from mp_logon3 
where status='new' 
and session in (select distinct b.session from mp_logon3 b 
where b.status = 'new' 
) 
group by session, status, flavor 

最後に、全体としてこのクエリを記述するより良い方法がある。たぶん1組合なし? TeradataのSQL使用

+0

ためHiveQLソリューションであるオラクル、SQLのSerバージョン、MySQLなど) –

+0

おっと、ご意見ありがとうございます。これはハイブSQLです。私は今それを追加しました。 –

答えて

1

は(DBMS問題

WITH sessions 
AS (SELECT DISTINCT session 
    FROM mp_logon3 
    WHERE STATUS = 'new') 
,logons 
AS (SELECT session 
     ,ts 
     ,STATUS 
     ,color 
     ,row_number() OVER (
      PARTITION BY session 
      ,STATUS ORDER BY ts 
      ) AS r_num 
    FROM mp_logon3) 
SELECT l.* 
FROM logons l 
INNER JOIN sessions s ON (s.session = l.session) 
WHERE l.STATUS <> 'new' 
    OR l.r_num = 1 
ORDER BY l.session 
    ,l.ts; 
1

の場合:?ここ

select session, ts, status, color 
from mp_logon3 
where status='new' 
and session in (select distinct a.session from mp_logon3 a 
where a.status = 'new' 
) 
qualify row_number() over (partition by session,status order by ts)=1 
union 
select session, ts, status, flavor from mp_logon3 
where status!='new' 
and session in (select distinct a.session from mp_logon3 a 
where a.status = 'new' 
) 
+1

ありがとうございますが、実際にはハイブSQLです。私は今それを指定しました。 –

関連する問題