我有一个复杂的查询,我将在此处尝试简化以证明我的问题。
基本上,对于调度应用程序,我试图计算同时发生的记录(点)的数量(以 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/