我在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)
,但是ModelCount
和DistanceAvg
是同一选择语句的列别名,因此无法像这样引用它们,但是您可以完成(COUNT(MODEL) * AVG(DISTANCE))
。因此,有两种方法可以解决此问题,或者在新列的定义(例如第一个示例)中重复您要引用的列的定义。或者第二个是您可能已经将select语句变成了子选择。然后,外部选择将理解您的列别名,并允许您在新的动态列的定义中使用它们。