我在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作为额外的专栏。
答案 0 :(得分: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;
也可以这样完成:
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语句转换为子选择。然后外部选择将理解您的列别名,并允许您在新动态列的定义中使用它们。