MySQL获取COUNT()的MAX(),获取错误的聚合值

MySQL获取COUNT()的MAX(),获取错误的聚合值,mysql,sql,aggregate-functions,Mysql,Sql,Aggregate Functions,我有一个复杂的问题,为了演示我的问题,我将在这里尝试简化 实际上,对于一个调度应用程序,我试图计算在15分钟间隔内同时出现的记录点的数量,所以我将其分组。每个15分钟的块都有一个特定的计算列值age_值与其关联。例如: +------------+-------+-------+-----------+ | date | start | spots | age_value | +------------+-------+-------+-----------+ | 2013-08-0

我有一个复杂的问题,为了演示我的问题,我将在这里尝试简化

实际上,对于一个调度应用程序,我试图计算在15分钟间隔内同时出现的记录点的数量,所以我将其分组。每个15分钟的块都有一个特定的计算列值age_值与其关联。例如:

+------------+-------+-------+-----------+
| 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的一个特性,该特性被显式地记录下来,用于返回列值的不确定结果。我会考虑依赖记录的行为不作为不安全的工作。