2017-02-01 9 views
1

私は、年のデータをグループ化することによって、車両の装備に関連する大規模なデータセットを統合しようとしています。たとえば、データベースの特定のSKUは、2012 Hyundai Elantra GLSに適合する可能性があります。その同じSKUは、同じ車両に合うかもしれませんが、年2013、2014、および非常に小さなデータセットでは2015年に、次のクエリは、私が探しているものを実現し...:Google Big Query - 年の範囲を連結する

SELECT 
sku, 
CASE 
    WHEN MIN(YEAR) = MAX(YEAR) THEN MIN(YEAR) 
    ELSE CONCAT(MIN(YEAR), '-', MAX(YEAR)) 
END AS YEAR, 
make, model, submodel, notes 
FROM 
(SELECT @ldfnr:= IF((@old_make = tab.make 
    AND @old_model = tab.model 
    AND @old_submodel = tab.submodel 
    AND @old_notes = tab.notes 
    AND (@old_year = tab.`year` 
    OR @old_year = tab.`year`-1)) , @ldfnr, @ldfnr+1) AS nr, tab.* , 
    @old_make := tab.make , @old_model := tab.model , 
    @old_submodel := tab.submodel , @old_notes := tab.notes , 
    @old_year := tab.`year` 
FROM tableName AS tab, 
    (SELECT @ldfnr:=0, @old_model:='', @old_submodel:='', @old_notes:='', @old_year:='', @old_make:='' ) AS tmp 
ORDER BY make, model, submodel, notes, `YEAR` ASC) AS mytab 
GROUP BY nr 
ORDER BY nr; 

しかし、私たちのデータセットはかなり大きい。このため、Google BigQueryにデータを読み込み、そこに同じクエリを実行しようとしていました。おそらくGoogle BigQueryの制限ですが、9行目の2列目のエラーを返すことになります。これがセカンダリSELECTクエリが見つかる場所です。

SQLFiddleのサンプルデータは参考にしています。

私は潜在的にこれを完了するためにAWSを使用していますが、私はそれを最初に試してみると思いました。私はあなたの時間を感謝します。 :-)以下は

編集...:

以下

データが今どのように見えるかですが...:

+------+-------------+-----------+-------+----------+------------------------------------------+ 
| SKU | Year  | Make | Model | Submodel |     Notes     | 
+------+-------------+-----------+-------+----------+------------------------------------------+ 
| 0001 | 1995 - 1997 | Chevrolet | Astro | Base  | Clear Lens; Chrome Housing; Pair; 1 pc.; | 
| 0001 | 1995 - 1996 | Chevrolet | Astro | CL  | Clear Lens; Chrome Housing; Pair; 1 pc.; | 
| 0001 | 1995 - 1996 | Chevrolet | Astro | LS  | Clear Lens; Chrome Housing; Pair; 1 pc.; | 
| 0001 | 1997  | Chevrolet | Astro | LT  | Clear Lens; Chrome Housing; Pair; 1 pc.; | 
| 0001 | 2001  | Chevrolet | Astro | Base  | Clear Lens; Chrome Housing; Pair; 1 pc.; | 
+------+-------------+-----------+-------+----------+------------------------------------------+ 

I:

以下
+------+------+-----------+-------+----------+------------------------------------------+ 
| SKU | Year | Make | Model | Submodel |     Notes     | 
+------+------+-----------+-------+----------+------------------------------------------+ 
| 0001 | 1995 | Chevrolet | Astro | Base  | Clear Lens; Chrome Housing; Pair; 1 pc.; | 
| 0001 | 1995 | Chevrolet | Astro | CL  | Clear Lens; Chrome Housing; Pair; 1 pc.; | 
| 0001 | 1995 | Chevrolet | Astro | LS  | Clear Lens; Chrome Housing; Pair; 1 pc.; | 
| 0001 | 1996 | Chevrolet | Astro | Base  | Clear Lens; Chrome Housing; Pair; 1 pc.; | 
| 0001 | 1996 | Chevrolet | Astro | CL  | Clear Lens; Chrome Housing; Pair; 1 pc.; | 
| 0001 | 1996 | Chevrolet | Astro | LS  | Clear Lens; Chrome Housing; Pair; 1 pc.; | 
| 0001 | 1997 | Chevrolet | Astro | Base  | Clear Lens; Chrome Housing; Pair; 1 pc.; | 
| 0001 | 1997 | Chevrolet | Astro | LT  | Clear Lens; Chrome Housing; Pair; 1 pc.; | 
| 0001 | 2001 | Chevrolet | Astro | Base  | Clear Lens; Chrome Housing; Pair; 1 pc.; | 
+------+------+-----------+-------+----------+------------------------------------------+ 

が望ましい結果であります以前はそれを含めないと申し訳ありません!あなただけの年の範囲を連結したい場合は、(ポータブルおよびそれ以上)に容易がある:-)

+0

サンプルを編集してサンプルデータ*と*の結果を提供してください。 MySQL特有のコードが別のデータベースで実行されると考える理由はありません。特に、変数として特注品を使用しているコード。 –

+0

@GordonLinoffヒントをありがとう!私はもちろん、それを含めることを意味したが、それは私の心を完全にスリップした。ご協力いただきありがとうございます。 :) –

+0

あなたは知っている可能性が高いですが、思い出したかったです:o) - 重要なので、投票の下に投稿された回答の左側にあるチェックマークを使用して、「受け付けた回答をマークする」ことができます。重要な理由については、http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235を参照してください。答えに投票することも重要です。役に立った答えを投票してください。もっとたくさんあります...誰かがあなたの質問に答えるときに何をすべきかを確認することができます - http://stackoverflow.com/help/someone-answers。 –

答えて

3

ウィンドウ関数を使用した方法:

select sku, make, model, submodel, notes, 
     (case when min(year) = max(year) then min(year) 
      else min(year) || '-' || max(year) 
     end) as year 
from (select qt.*, 
      sum(case when qtprev.make is null then 1 else 0 end) over (partition by qt.make, qt.model, qt.notes, qt.submodel, qt.sku order b qt.year) as grp 
     from `tint-world-aces-processing.aces_table.queryTest` qt left join 
      `tint-world-aces-processing.aces_table.queryTest` qtprev 
      on qt.make = qtprev.make and qt.model = qtprev.model and 
       qt.notes = qtprev.notes and qt.submodel = qtprev.submodel and 
       qt.sku = qtprev.sku and qt.year = qtprev.year + 1 
    ) qt 
group by sku, make, model, submodel, notes; 

(StandardSQLへの微妙な変化に注意してください。)

+0

これは確かにきれいで、本当に感謝しています!すぐに実行しようとしましたが、BigQueryでエラーが発生しました。私が受け取るエラーは次のとおりです:行3、列36で "" max ""が発生しました。期待していた: "END"。 私は最も強力なSQLスキルを持っていないので、私はここで何が欠けているのかよく分かりません。 @BrianSchroeter。 –

+0

。 。連結演算子がありませんでした。 –

1

以下はBigQuery Standard SQLのためのものであり、JOINはありません。

#standardSQL 
WITH yourTable AS (
    SELECT 
    '0001' AS SKU, 1995 AS Year, 'Chevrolet' AS Make, 'Astro' AS Model, 'Base' AS Submodel, 
    'Clear Lens; Chrome Housing; Pair; 1 pc.;' AS Notes UNION ALL 
    SELECT '0001', 1995, 'Chevrolet', 'Astro', 'CL', 'Clear Lens; Chrome Housing; Pair; 1 pc.;' UNION ALL 
    SELECT '0001', 1995, 'Chevrolet', 'Astro', 'LS', 'Clear Lens; Chrome Housing; Pair; 1 pc.;' UNION ALL 
    SELECT '0001', 1996, 'Chevrolet', 'Astro', 'Base', 'Clear Lens; Chrome Housing; Pair; 1 pc.;' UNION ALL 
    SELECT '0001', 1996, 'Chevrolet', 'Astro', 'CL', 'Clear Lens; Chrome Housing; Pair; 1 pc.;' UNION ALL 
    SELECT '0001', 1996, 'Chevrolet', 'Astro', 'LS', 'Clear Lens; Chrome Housing; Pair; 1 pc.;' UNION ALL 
    SELECT '0001', 1997, 'Chevrolet', 'Astro', 'Base', 'Clear Lens; Chrome Housing; Pair; 1 pc.;' UNION ALL 
    SELECT '0001', 1997, 'Chevrolet', 'Astro', 'LT', 'Clear Lens; Chrome Housing; Pair; 1 pc.;' UNION ALL 
    SELECT '0001', 2001, 'Chevrolet', 'Astro', 'Base', 'Clear Lens; Chrome Housing; Pair; 1 pc.;' 
) 
SELECT SKU, 
    IF(MIN(Year) = MAX(Year), 
    CAST(MIN(Year) AS STRING), 
    CONCAT(CAST(MIN(Year) AS STRING), ' - ', CAST(MAX(Year) AS STRING)) 
) AS Year, 
    Make, Model, Submodel, Notes 
FROM (
    SELECT SKU, Year, Make, Model, Submodel, Notes, 
    SUM(Step) OVER(PARTITION BY SKU, Make, Model, Submodel, Notes ORDER BY Year) AS grp 
    FROM (
    SELECT SKU, Year, Make, Model, Submodel, Notes, 
     IFNULL(SIGN(Year - 1 - LAG(Year) OVER(PARTITION BY SKU, Make, Model, Submodel, Notes ORDER BY Year)), 1) AS Step 
    FROM yourTable 
) 
) 
GROUP BY SKU, Make, Model, Submodel, Notes, grp 
関連する問題