我在csv上使用hadoop来分析一些数据。我使用sql / mysql(不确定)来分析数据,现在我陷入了僵局。

我花了几个小时在谷歌上搜索,甚至没有发现任何与远程相关的东西。我需要有一个查询,其中我要对一列进行计数,然后对一列的总和或平均值求和。

这不起作用:

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;

其余代码工作正常,但所有注释的解决方案均无效。数小时的谷歌搜索,没有运气。

理解我所追求的似乎有些问题,我需要弄清楚的是如何通过将计数值与平均值相乘来获得结果,如下所示:
SUM(COUNT(model)*AVG(distance)) AS TOTAL

我想对模型进行计数,以找出其中存在多少,这很好。然后,我希望通过功能获取与该组一起获得的所有汽车中模型驱动的平均距离。然后,我希望查询将乘以这些特定汽车行驶的平均距离的汽车数量相乘。

我可以获取所需的值并手动计算值,我只是希望有一种方法可以跳过手动计算,因为在此规模上要做的工作非常艰巨。该列表中确实有500万辆汽车,在这些条件下我无法手动工作。

不确定这是否有帮助,但这里是工作查询,需要在此添加:
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;

这是它生成的结果:
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

我需要将suosituinmalli乘以keskilukema作为附加列。

最佳答案

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;

也可以这样完成:
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;

其他人在评论中说的是,您不能在另一个动态列的定义中使用列别名。因此,在上面的示例中,您声明了SUM(ModelCount * DistanceAvg),但是ModelCountDistanceAvg是同一选择语句的列别名,因此无法像这样引用它们,但是您可以完成(COUNT(MODEL) * AVG(DISTANCE))。因此,有两种方法可以解决此问题,或者在新列的定义(例如第一个示例)中重复您要引用的列的定义。或者第二个是您可能已经将select语句变成了子选择。然后,外部选择将理解您的列别名,并允许您在新的动态列的定义中使用它们。

10-04 10:53