2017-02-01 1 views
1

Ich versuche, große Datensätze in Bezug auf Fahrzeugeinrichtung zu konsolidieren, indem Sie die Jahresdaten gruppieren. Zum Beispiel könnte eine bestimmte Artikelnummer in unserer Datenbank für einen 2012 Hyundai Elantra GLS passen. Das gleiche SKU kann passen auch das gleiche Fahrzeug, aber in den Jahren 2013, 2014 und 2015. Bei sehr kleinen Datensätzen erreicht die folgende Abfrage, was ich suche ...:Google Big Query - Verkettete Jahr Bereiche

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; 

jedoch unsere Datensätze sind ziemlich groß. Aus diesem Grund habe ich versucht, die Daten in Google BigQuery zu laden und dort dieselbe Abfrage durchzuführen. Möglicherweise handelt es sich um eine Einschränkung von Google BigQuery, aber es wird immer ein Fehler zurückgegeben, der sich auf Zeile 9 und Spalte 2 bezieht. Hier kann die sekundäre SELECT-Abfrage gefunden werden.

Ich habe einige unserer Beispieldaten auf SQLFiddle als Referenz.

Ich schaue möglicherweise mit AWS, um dies zu beenden, aber ich dachte, ich würde es hier zuerst versuchen. Ich schätze deine Zeit. :-)

Bearbeiten Titel ...:

Unten ist, wie die Daten jetzt aussieht ...:

+------+------+-----------+-------+----------+------------------------------------------+ 
| 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.; | 
+------+------+-----------+-------+----------+------------------------------------------+ 

Im Folgenden finden Sie die gewünschten Ergebnisse:

+------+-------------+-----------+-------+----------+------------------------------------------+ 
| 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 Tut mir leid, dass ich das vorher nicht eingeschlossen habe! :-)

+0

Bearbeiten Sie Ihre Frage und Beispieldaten * liefern und * die gewünschten Ergebnisse. Es gibt keinen Grund zu der Annahme, dass MySQL-spezifischer Code in einer anderen Datenbank ausgeführt wird, insbesondere Code, der etwas verwendet, das so maßgeschneidert ist wie Variablen. –

+0

@GordonLinoff Danke für den Tipp! Ich wollte das natürlich mit einbeziehen, aber es ist mir völlig entfallen. Vielen Dank für Ihre Hilfe. :) –

+0

höchstwahrscheinlich wissen Sie - aber wollte erinnern: o) - Wichtig auf SO - Sie können "akzeptierte Antwort markieren", indem Sie das Häkchen auf der linken Seite der veröffentlichten Antwort, unter der Abstimmung. Siehe http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235 warum dies wichtig ist! Es ist auch wichtig, über die Antwort zu stimmen. Stimmen Sie Antworten ab, die hilfreich sind. Es gibt mehr ... Sie können überprüfen, was zu tun ist, wenn jemand Ihre Frage beantwortet - http://stackoverflow.com/help/someone-answers. –

Antwort

3

Wenn Sie nur Bereiche von Jahren verketten gibt es einfacher (und mehr tragbar) Möglichkeiten, Fenster Funktionen: (. Beachten Sie die subtile Veränderung zu StandardSQL)

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; 

+0

Das ist sicherlich sauberer und ich schätze es sehr! Ich habe versucht, es sofort auszuführen, aber in BigQuery ist ein Fehler aufgetreten. Der Fehler, den ich erhalte, ist ...: "" Max "" in Zeile 3, Spalte 36. Hat erwartet: "END". Ich habe nicht die stärksten SQL-Fähigkeiten, und deshalb bin ich mir nicht ganz sicher, was ich hier vermisse. –

+0

@BrianSchroeter. . . Es fehlte der Verkettungsoperator. –

1

unten ist für BigQuery Standard-SQL und ohne 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 
Verwandte Themen