MySQL 离开加入子查询分组依据

标签 mysql group-by left-join

我有一个要求,我需要将数据分组为相等数量的 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/

相关文章:

PHP MySql : how save timestamp UTC, 像 "Flickr"吗?

python - PySpark 在 GroupBy 之后加入

php - 与另一个表没有关系的 LeftJoin 别名创建问题 Doctrine Symfony

php - Mysql...价格范围内的价格范围?

php - 跨 session 的用户特定内容建议 [MySQL/Web]

MySQL 计算 MAX 时间戳后的结果

mysql - 按月汇总多条记录

MySQL - 左加入......在......喜欢

mysql左连接/右连接3张表

mysql - 如何显示mysql表中多列的一行数据