我有一个bus_pings表:
CREATE TABLE bus_pings(
id int(12) unsigned NOT NULL AUTO_INCREMENT,
ping_time DATETIME(3),
line INT(10),
speed DECIMAL(3,2),
PRIMARY KEY (id)
);
我希望得到按日期分组的平均速度,并为每个不同的行分隔列。 像这样:
DATE LINE_74 LINE_96 LINE_86 LINE_91
2017-10-15 14,2868246445 14,719426483 16,1636562671 15,5332546242
2017-10-16 13,1164417178 14,214340589 14,7644345606 13,3649570639
2017-10-17 11,6387929133 12,2247682434 12,7987289148 11,5381412639
我可以使用此查询获得一行的平均速度:
SELECT DISTINCT DATE_FORMAT(ping_time, '%Y-%m-%d'), AVG(speed) as speed_average
FROM bus_pings
WHERE line=74
GROUP BY DATE_FORMAT(ping_time, '%Y-%m-%d')
但我有很多总线,我需要在一个查询中查询所有行。有没有优雅的解决方案?
答案 0 :(得分:1)
您可以在此处使用透视查询:
SELECT
DATE_FORMAT(ping_time, '%Y-%m-%d'),
AVG(CASE WHEN line=74 THEN speed END) AS line_74_avg,
AVG(CASE WHEN line=96 THEN speed END) AS line_96_avg,
AVG(CASE WHEN line=86 THEN speed END) AS line_86_avg,
AVG(CASE WHEN line=91 THEN speed END) AS line_91_avg
FROM bus_ping
WHERE line IN (74, 96, 86, 91)
GROUP BY
DATE_FORMAT(ping_time, '%Y-%m-%d')
这里的基本想法是对您的表进行一次传递,并使用CASE
表达式有条件地获取各行的平均值。
答案 1 :(得分:1)
这是一个有效的查询...
SELECT line
, DATE_FORMAT(ping_time, '%Y-%m-%d')
, AVG(speed) speed_average
FROM bus_pings
GROUP
BY line
, DATE_FORMAT(ping_time, '%Y-%m-%d');
其他一切都应该在应用程序代码中处理。