2017-08-01 9 views
1

おはよう、標準SQLを使用してBigQueryの行に行を転記

大きなクエリで一部のデータを転置しようとしています。私はstackoverflowでこれを尋ねたいくつかの人を見てきましたが、これを行う方法は、標準SQLではなく、従来のsql(group_concat_unquotedを使用)を使用するように思われます。私はレガシーを使用しますが、過去にネストされたデータに関する問題を抱えていました。ここで

は私は以下の持っているいくつかの顧客の旅をマップしようとしているいくつかのコンテキストを与えるために、私の例です:

uniqueid | page_flag | order_of_pages 
A  | Collection| 1 
A  | Product | 2 
A  | Product | 3 
A  | Login  | 4 
A  | Delivery | 5 
B  | Clearance | 1 
B  | Search | 2 
B  | Product | 3 
C  | Search | 1 
C  | Collection| 2 
C  | Product | 3 

私はそれが次のようになりますので、データを転置したいと思いますが:

uniqueid | 1   | 2   | 3  | 4  | 5 
A  | Collection | Product | Product | Login | Delivery 
B  | Clearance | Search  | Product | NULL | NULL 
C  | Search  | Collection | Product | NULL | NULL 

私は複数の左ジョイン使用してみましたが、次のエラーを取得しました:

select a.uniqueid, 
b.page_flag as page1, 
c.page_flag as page2, 
d.page_flag as page3, 
e.page_flag as page4, 
f.page_flag as page5 

from 

(select distinct uniqueid, 
(case when uniqueid is not null then 1 end) as page_hit1, 
(case when uniqueid is not null then 2 end) as page_hit2, 
(case when uniqueid is not null then 3 end) as page_hit3, 
(case when uniqueid is not null then 4 end) as page_hit4, 
(case when uniqueid is not null then 5 end) as page_hit5 
from `mytable`) a 

LEFT JOIN (
SELECT * 
from `mytable`) b on a.uniqueid = b.uniqueid 
and a.page_hit1 = b.order_of_pages 


LEFT JOIN (
SELECT * 
from `mytable`) c on a.uniqueid = c.uniqueid 
and a.page_hit2 = c.order_of_pages 


LEFT JOIN (
SELECT * 
from `mytable`) d on a.uniqueid = d.uniqueid 
and a.page_hit3 = d.order_of_pages 


LEFT JOIN (
SELECT * 
from `mytable`) e on a.uniqueid = e.uniqueid 
and a.page_hit4 = e.order_of_pages 


LEFT JOIN (
SELECT * 
from `mytable`) f on a.uniqueid = f.uniqueid 
and a.page_hit5 = f.order_of_pages 



Error: Query exceeded resource limits for tier 1. Tier 13 or higher required. 

私はArray関数を使用して見てきましたが、私は以前これを使用していないと私はこれがちょうど逆に転置のためのものであるかどうかはわかりません。どんな助言も壮大になるでしょう。

は、BigQueryの標準SQL

#standardSQL 
SELECT 
    uniqueid, 
    MAX(IF(order_of_pages = 1, page_flag, NULL)) AS p1, 
    MAX(IF(order_of_pages = 2, page_flag, NULL)) AS p2, 
    MAX(IF(order_of_pages = 3, page_flag, NULL)) AS p3, 
    MAX(IF(order_of_pages = 4, page_flag, NULL)) AS p4, 
    MAX(IF(order_of_pages = 5, page_flag, NULL)) AS p5 
FROM `mytable` 
GROUP BY uniqueid 

のためにあなたに

答えて

2

ありがとうあなたはあなたの質問からダミーデータの下で/テストを再生することができ

#standardSQL 
WITH `mytable` AS (
    SELECT 'A' AS uniqueid, 'Collection' AS page_flag, 1 AS order_of_pages UNION ALL 
    SELECT 'A', 'Product', 2 UNION ALL 
    SELECT 'A', 'Product', 3 UNION ALL 
    SELECT 'A', 'Login', 4 UNION ALL 
    SELECT 'A', 'Delivery', 5 UNION ALL 
    SELECT 'B', 'Clearance', 1 UNION ALL 
    SELECT 'B', 'Search', 2 UNION ALL 
    SELECT 'B', 'Product', 3 UNION ALL 
    SELECT 'C', 'Search', 1 UNION ALL 
    SELECT 'C', 'Collection', 2 UNION ALL 
    SELECT 'C', 'Product', 3 
) 
SELECT 
    uniqueid, 
    MAX(IF(order_of_pages = 1, page_flag, NULL)) AS p1, 
    MAX(IF(order_of_pages = 2, page_flag, NULL)) AS p2, 
    MAX(IF(order_of_pages = 3, page_flag, NULL)) AS p3, 
    MAX(IF(order_of_pages = 4, page_flag, NULL)) AS p4, 
    MAX(IF(order_of_pages = 5, page_flag, NULL)) AS p5 
FROM `mytable` 
GROUP BY uniqueid 
ORDER BY uniqueid 

結果は

uniqueid p1   p2   p3  p4  p5 
A   Collection Product  Product Login Delivery  
B   Clearance Search  Product null null  
C   Search  Collection Product null null 
0であります

は上記と同じダミーデータで実行する場合にも(ただし旋回しない)アプローチの下

#standardSQL 
SELECT uniqueid, 
    STRING_AGG(page_flag, '>' ORDER BY order_of_pages) AS journey 
FROM `mytable` 
GROUP BY uniqueid 
ORDER BY uniqueid 

を検討することができ、ニーズに依存します - 結果は

uniqueid journey 
A   Collection>Product>Product>Login>Delivery  
B   Clearance>Search>Product  
C   Search>Collection>Product  
+0

優秀で、再びミハイルをお願いします。どちらの方法も完璧に機能しました。 –

関連する問題