ハイブ テーブルの列でシーケンスを検出しようとしています。3 つの列 (id、ラベル、インデックス) があります。各 ID には一連のラベルがあり、index はラベルの順序です。
id label index
a x 1
a y 2
a x 3
a y 4
b x 1
b y 2
b y 3
b y 4
b x 5
b y 6
x、y、x、y のラベル シーケンスが発生するかどうかを識別したいと考えています。
私は次のようにこれを達成するためにリード関数を試すことを考えていました:
select id, index, label,
lead( label, 1) over (partition by id order by index) as l1_fac,
lead( label, 2) over (partition by id order by index) as l2_fac,
lead( label, 3) over (partition by id order by index) as l3_fac
from mytable
収量:
id index label l1_fac l2_fac l3_fac
a 1 x y x y
a 2 y x y NULL
a 3 x y NULL NULL
a 4 y NULL NULL NULL
b 1 x y y y
b 2 y y y x
b 3 y y x y
b 4 y x y NULL
b 5 x y NULL NULL
ここで、l1(2,3) は次のラベル値です。次に、パターンを確認できます
where label = l2_fac and l1_fac = l3_fac
これは id = a では機能しますが、ラベル シーケンスが x、y、y、y、y、x である id = b では機能しません。3 y が連続していることは気にしません。x から y へ、x から y へと移動したことに興味があるだけです。
これが可能かどうかはわかりません。group by と partition の組み合わせを試しましたが、成功しませんでした。