MySQL Taking MAX() of a COUNT(),得到错误的聚合值

标签 mysql sql aggregate-functions

我有一个复杂的查询,我将在此处尝试简化以证明我的问题。

基本上,对于调度应用程序,我试图计算同时发生的记录(点)的数量(以 15 分钟为间隔),因此我将其分组。每个 15 分钟的 block 都有一个与之关联的特定计算列值 (age_value)。例如:

+------------+-------+-------+-----------+
| 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 |
+------------+-------+-------+-----------+

现在,这是一个子查询。在它周围我有另一个查询来获取点数的最大值。 IE。在特定时间段内(在本例中为 9:30 - 18:00)占用的最大点数是多少。

现在是出错的重要部分: 我想获取具有最高点值的记录的 age_value。在本例中为 1060701。但是,问题似乎总是返回子查询中第一行的 age_value。在示例情况下这是正确的,因为第一行也是点数最多的行。但情况并非总是如此!

最好的方法是什么? ORDER BY 点 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

最佳答案

您正在使用 documentation 的 MySQL 扩展明确警告不要使用。您应该确保聚合查询的 select 中的所有列要么是聚合函数的参数,要么是 group by 子句中的参数——除非您真的非常确定关于你在做什么。

在您的情况下,您可以使用 substring_index()/group_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;

关于MySQL Taking MAX() of a COUNT(),得到错误的聚合值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25733903/

相关文章:

php - 根据mysql结果的div导致循环

sql - 垂直到水平?

SQL查询根据其他字段统计有多少个值

mysql - #1305 FUNCTION dbname.json_arrayagg 不存在

mysql 在分组前排序

python - Cursor.execute 在 Python 中不起作用

mysql - 计算 X 天内在不同表中输入了多少行的最有效方法?

php - "Type error: Too few arguments to function App\Http\Controllers\FrontController::detail(), 0 passed and exactly 1 expected"

sql - 仅返回两个表中的重复行

sql-server - 不能使用 MIN、MAX 等 SQL Server 2012