2016-08-22 4 views
0

Ich verwende Hadoop auf CSV, um einige Daten zu analysieren. Ich benutze sql/mysql (nicht sicher), um die Daten zu analysieren, und jetzt bin ich auf einem Impass.SUMME (COUNT (Spalte) * AVG (Spalte)) AS-Spalte

Ich verbrachte diese Stunden und Stunden zu googeln ohne etwas zu finden, das auch nur entfernt verwandt ist. Ich muss eine Abfrage haben, wo ich eine Spalte und entweder Summe oder Durchschnitt der Spalte zählen und sie miteinander multiplizieren.

Dies funktioniert nicht:

SELECT model, 
     brand, 
     COUNT(model) AS ModelCount, 
     AVG(distance) AS DistanceAvg, 
     // OR SUM(distance) AS DistanceSum 
     // SUM(ModelCount * DistanceAvg) AS Total 
     // SUM(ModelCount * DistanceSum) AS Total 
     // SUM(COUNT(model)*AVG(distance)) AS Total 
     // SUM(COUNT(model)*SUM(distance)) AS Total 
     // None of the commented lines work 
FROM cars 
WHERE type = 'M1' OR type = 'M1G' 
GROUP BY model, brand 
ORDER BY ModelCount DESC; 

Der Rest des Codes funktioniert gut, aber keiner der kommentierten Lösungen zu arbeiten. Stundenlanges Googeln, kein Glück.

Es scheint Probleme zu sein, zu verstehen, was ich bin nach, was ich brauche ist, herauszufinden, wie sich aus der Multiplikation Zählwert mit gemittelten Wert ein Ergebnis zu erhalten, wie folgt:

SUM(COUNT(model)*AVG(distance)) AS TOTAL 

ich die Modelle zählen möchten Um herauszufinden, wie viele von ihnen existieren, funktioniert das gut. Dann möchte ich die durchschnittliche Strecke mit dem Modell aus allen Autos herausholen, die ich mit der Gruppe erhalte, indem ich funktioniere. Und dann möchte ich die Abfrage die Anzahl der Autos mit der durchschnittlichen Strecke multipliziert mit diesen bestimmten Autos multiplizieren.

Ich kann die Werte erhalten, die ich brauche, und manuell den Wert berechnen, ich hatte nur gehofft, dass es eine Möglichkeit gibt, diese Berechnung manuell zu überspringen, da es eine große Arbeit in diesem Maßstab ist. Es gibt buchstäblich 5 Millionen Autos in dieser Liste, ich kann unter diesen Bedingungen nicht manuell arbeiten.

Nicht sicher, ob das hilft, aber heres Abfrage arbeiten, wo ich diese hinzugefügt:

SELECT mallimerkinta, 
     merkkiSelvakielinen, 
     COUNT(mallimerkinta) AS Suosituinmalli, 
     ROUND(AVG(CAST(matkamittarilukema AS FLOAT)),0) AS Keskilukema 
FROM ajoneuvot 
WHERE ajoneuvoluokka = 'M1' OR ajoneuvoluokka = 'M1G' 
GROUP BY mallimerkinta, merkkiSelvakielinen 
HAVING COUNT(mallimerkinta) > '4659' 
ORDER BY Keskilukema DESC; 

Hier sind die Ergebnisse es erzeugt:

mallimerkinta merkkiselvakielinen  suosituinmalli keskilukema 

4D COROLLA 1.6XLI-AE101L-AEMDKW/247  Toyota 4715 267686.0 

5D MONDEO STW 1.8-BWY/275 Ford 6021 226086.0 

5D FOCUS STW 1.6-DNW/262 Ford 10571 216980.0 

5D GOLF VARIANT 1.6-1J/250 Volkswagen 13136 200201.0 

V70 Farmari (AC) 4ov 2400cm3 A Volvo 5912 198062.0 

4D FOCUS HATCHBACK 1.6-DAW/262 Ford 5899 197925.0 

4D BORA SEDAN 1.6-1J/250 Volkswagen 4660 180550.0 

5D COROLLA STW 1.6-ZZE121L-DWMDKW/260 Toyota 4999 180221.0 

5D COROLLA STW 1.6-ZZE121L-DWMNKW/260 Toyota 4990 176687.0 

4D ALMERA SEDAN 1.5-BAAN16/254 Nissan 8421 156514.0 

XC60 Farmari (AC) 4ov 2400cm3 A  Volvo 7900 113591.0 

GOLF Farmari (AC) 4ov 1390cm3 Volkswagen 6215 87724.0 

FOCUS Farmari (AC) 4ov 1596cm3 Ford 5063 86598.0 

GOLF Farmari (AC) 4ov 1390cm3 A  Volkswagen 5634 83164.0 

CEED Monik�ytt�ajoneuvo (AF) 4ov 1591cm3 Kia  5191 78059.0 

TOYOTA AVENSIS Monik�ytt�ajoneuvo (AF) 4ov 1798cm3 Toyota 6384 68166.0 

NISSAN QASHQAI Monik�ytt�ajoneuvo (AF) 4ov 1598cm3 Nissan 10595 59330.0 

FIESTA Viistoper� (AB) 4ov 1242cm3 Ford 5631 58837.0 

TOYOTA AURIS Monik�ytt�ajoneuvo (AF) 4ov 1798cm3 Toyota 5558 56878.0 

TOYOTA YARIS Monik�ytt�ajoneuvo (AF) 4ov 1329cm3 Toyota 11829 40348.0 

I suosituinmalli müssen von keskilukema als multiplizierte zusätzliche Spalte.

+0

Sie können keine Aliase verwenden, die zuvor in der gleichen Abfrage definiert wurden. Dies ist der Grund, warum die kommentierten Zeilen nicht funktionieren. Verwenden Sie die tatsächlichen Berechnungen anstelle von Aliasen und es wird funktionieren. –

+0

Ich verstehe nicht, was Sie von Ihrem Skript meinen, geben Sie nur eine klare Beispieldaten und ein klares Beispielergebnis. –

+0

vkp, der kommentierte Abschnitt enthält die tatsächlichen Berechnungen als Option oder ich habe keine Ahnung, was Sie meinen. – JoniTL

Antwort

0
SELECT mallimerkinta, 
     merkkiSelvakielinen, 
     COUNT(mallimerkinta) AS Suosituinmalli, 
     ROUND(AVG(CAST(matkamittarilukema AS FLOAT)),0) AS Keskilukema, 
     COUNT(mallimerkinta) * ROUND(AVG(CAST(matkamittarilukema AS FLOAT)),0) AS DesiredColumn 
FROM ajoneuvot 
WHERE ajoneuvoluokka = 'M1' OR ajoneuvoluokka = 'M1G' 
GROUP BY mallimerkinta, merkkiSelvakielinen 
HAVING COUNT(mallimerkinta) > '4659' 
ORDER BY Keskilukema DESC; 

Auch kann wie so geschehen:

SELECT 
    t.* 
    ,t.Suosituinmalli * t.Keskilukema AS DesiredColumn 
FROM 
    (
     SELECT mallimerkinta, 
      merkkiSelvakielinen, 
      COUNT(mallimerkinta) AS Suosituinmalli, 
      ROUND(AVG(CAST(matkamittarilukema AS FLOAT)),0) AS Keskilukema, 
     FROM ajoneuvot 
     WHERE ajoneuvoluokka = 'M1' OR ajoneuvoluokka = 'M1G' 
     GROUP BY mallimerkinta, merkkiSelvakielinen 
     HAVING COUNT(mallimerkinta) > '4659' 
    ) t 
ORDER BY Keskilukema DESC; 

Was die anderen in ihren Kommentaren zu sagen, dass Sie nicht Spalte Aliase in der Definition eines anderen dynamischen Spalte verwenden können. In Ihrem obigen Beispiel haben Sie SUM(ModelCount * DistanceAvg) angegeben, aber ModelCount und DistanceAvg sind Spaltenaliasnamen für dieselbe select-Anweisung, so dass sie nicht wie diese referenziert werden können, aber Sie könnten (COUNT(MODEL) * AVG(DISTANCE)) getan haben. Es gibt also zwei Möglichkeiten, das Problem zu beheben. Wiederholen Sie die Definitionen für Ihre Spalten, auf die Sie in der Definition Ihrer neuen Spalte verweisen möchten, wie im ersten Beispiel. Oder die zweite Möglichkeit wäre, dass Sie Ihre Select-Anweisung in eine Sub-Auswahl umgewandelt haben. Die äußere Auswahl würde dann Ihre Spaltenaliase verstehen und Ihnen erlauben, sie in der Definition einer neuen dynamischen Spalte zu verwenden.

+0

Dies ist die funktionierende Antwort, danke! – JoniTL

+0

Froh, dass die Antwort Ihnen geholfen hat. Bitte akzeptiere meine Antwort, damit andere die Frage nicht gelöst haben und keine weitere Arbeit benötigen. Hier ist ein Artikel darüber, wie/wann dies zu tun ist. Danke und willkommen bei stackoverflow http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Matt