2017-12-08 3 views
0

特定の "name2"の後に次の "name1"を取得しようとしています。たとえば、 "name2"の "complete2"の次の "name1"は "init3"です。これは私が使用するクエリですが、nullを返します。ここでハイブのリード関数

date_time     name1  name2   
    2017-11-23 00:09:46   init1  complete1 
    2017-11-23 00:09:48   init2  complete2 
    2017-11-23 00:09:50   init3  complete3 


    select date_time,name1,name2, 
    lead(name1,1) over (order by date_time) as next_word 
    from tab1 
    where date_time between "2017-11-23 00:00:00" and "2017-11-23 23:59:59" 
    and name2 like "%complete2%"; 

答えて

1

ソリューション

SELECT * 
    FROM (SELECT date_time,name1,name2, 
       LEAD(name1,1) over (ORDER BY date_time) AS next_word 
      FROM tab1 
     WHERE date_time between "2017-11-23 00:00:00" and "2017-11-23 23:59:59") v 
WHERE name2 LIKE "%complete2%"; 

出力

2017-11-23 00:09:48 init2 complete2 init3 

ハイブは、LEADを適用する前に、WHERE条件を評価しています。あなたの質問では、LEADが存在しない1つのレコードにLEADが適用されることを制限していました。

上記のようにサブクエリを使用するか、CTE/WITH句を使用できます。

希望すると便利です。