我有一个要求,我需要将数据分组为相等数量的 ob 行。由于 mysql 没有 rownum()
我正在模拟这种行为:
SET @row:=6;
SELECT MAX(agg.timestamp) AS timestamp, MAX(agg.value) AS value, COUNT(agg.value) AS count
FROM
(
SELECT timestamp, value, @row:=@row+1 AS row
FROM data
WHERE channel_id=52 AND timestamp >= 0 ORDER BY timestamp
) AS agg
GROUP BY row div 8
ORDER BY timestamp ASC;
注:根据Can grouped expressions be used with variable assignments?此查询可能不是 100% 正确,但它确实有效。
另一个要求是计算分组集之间的行差。我一直在寻找将同一个表与子查询连接起来的解决方案:
SET @row:=6;
SELECT MAX(agg.timestamp) AS timestamp, MAX(agg.value) AS value, COUNT(agg.value) AS count
FROM
(
SELECT timestamp, value, @row:=@row+1 AS row
FROM data
WHERE channel_id=52 AND timestamp >= 0 ORDER BY timestamp
) AS agg
LEFT JOIN data AS prev
ON prev.channel_id = agg.channel_id
AND prev.timestamp = (
SELECT MAX(timestamp)
FROM data
WHERE data.channel_id = agg.channel_id
AND data.timestamp < MIN(agg.timestamp)
)
GROUP BY row div 8
ORDER BY timestamp ASC;
不幸的是错误:
Error Code: 1054. Unknown column 'agg.channel_id' in 'on clause'
知道如何编写这个查询吗?
最佳答案
您从未从 sbuquery 中选择 channel_id
,因此它不会返回到父查询,因此是不可见的。尝试
SELECT MAX(agg.timestamp) AS timestamp, MAX(agg.value) AS value, COUNT(agg.value) AS count
FROM
(
SELECT timestamp, value, @row:=@row+1 AS row, channel_id
^^^^^^^^^^^^-- need this
FROM data
由于 MySQL 只看到并使用您从该子查询显式返回的字段,并且不会“深入”查询底层的表,因此您需要选择/返回您将使用父查询的所有字段.
关于MySQL 离开加入子查询分组依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24127741/