MySQL获取COUNT()的MAX(),获取错误的聚合值
我有一个复杂的问题,为了演示我的问题,我将在这里尝试简化 实际上,对于一个调度应用程序,我试图计算在15分钟间隔内同时出现的记录点的数量,所以我将其分组。每个15分钟的块都有一个特定的计算列值age_值与其关联。例如:MySQL获取COUNT()的MAX(),获取错误的聚合值,mysql,sql,aggregate-functions,Mysql,Sql,Aggregate Functions,我有一个复杂的问题,为了演示我的问题,我将在这里尝试简化 实际上,对于一个调度应用程序,我试图计算在15分钟间隔内同时出现的记录点的数量,所以我将其分组。每个15分钟的块都有一个特定的计算列值age_值与其关联。例如: +------------+-------+-------+-----------+ | date | start | spots | age_value | +------------+-------+-------+-----------+ | 2013-08-0
+------------+-------+-------+-----------+
| date | start | spots | age_value |
+------------+-------+-------+-----------+
| 2013-08-05 | 950 | 15 | 1060701 |
| 2013-08-05 | 975 | 15 | 1060701 |
| 2013-08-05 | 1000 | 15 | 1060701 |
| 2013-08-05 | 1025 | 15 | 1060701 |
| 2013-08-05 | 1050 | 14 | 1060700 |
..........................................
| 2013-08-05 | 1275 | 14 | 1060700 |
| 2013-08-05 | 1300 | 12 | 1050600 |
| 2013-08-05 | 1325 | 12 | 1050600 |
..........................................
| 2013-08-05 | 1700 | 12 | 1050600 |
| 2013-08-05 | 1725 | 12 | 1050600 |
| 2013-08-05 | 1750 | 12 | 1050600 |
| 2013-08-05 | 1775 | 12 | 1050600 |
+------------+-------+-------+-----------+
现在,这是一个子查询。在它周围,我有另一个查询,以获取斑点数量的最大值。也就是说,在这种情况下,在特定时间段内,9:30-18:00所占用的最大点数是多少
现在最重要的一点出了问题:我想得到记录的年龄值,它对斑点的值最高。在本例中为1060701。然而,问题似乎是它总是返回子查询中第一行的age_值。在本例中,这是正确的,因为第一行也是斑点数最多的一行。但事实并非总是如此
最好的方法是什么?按spots DESC上的子查询排序感觉有点脏,它将具有最高点的行始终放在顶部
我的简化查询:
SELECT subq.date, MAX(subq.spots) AS max_spots, age_value
FROM (
SELECT di.date,
ts.start,
COUNT(*) AS spots,
SUM(POW(10, ...)) AS age_value
FROM date_intervals di
JOIN occupancy_caches oc ON oc.date = di.date
JOIN time_slices ts ON ts.start < oc.end AND ts.start >= oc.start
AND ts.start BETWEEN 950 AND 1775
GROUP BY ts.start, di.date
) subq
GROUP BY subq.date
您使用的是MySQL扩展,服务器明确警告不要使用它。您应该确保select for aggregation查询中的所有列要么是聚合函数的参数,要么是group by子句中的所有列,除非您确实非常确定自己在做什么 在您的情况下,您可以使用子字符串\u index/group\u concat技巧获得您想要的:
SELECT subq.date, MAX(subq.spots) AS max_spots,
substring_index(group_concat(age_value order by subq.spots desc), ',', 1) as age_value
FROM (SELECT di.date, ts.start, COUNT(*) AS spots, SUM(POW(10, ...)) AS age_value
FROM date_intervals di JOIN
occupancy_caches oc
ON oc.date = di.date JOIN
time_slices ts
ON ts.start < oc.end AND ts.start >= oc.start AND ts.start BETWEEN 950 AND 1775
GROUP BY ts.start, di.date
) subq
GROUP BY subq.date;
谢谢你的澄清!从可维护性和/或性能的角度来看,是否有任何理由在子查询中对ORDER BY使用您的解决方案?我仍然不认为这是一种扩展。返回不正确的结果对我来说是一个更大的缺点——如果不是一个bug,那可能只是一个缺陷me@ChrisDekker . . . orderby方法使用MySQL的一个特性,该特性被显式地记录下来,用于返回列值的不确定结果。我会考虑依赖记录的行为不作为不安全的工作。