【问题标题】:Transpose two rows into single row (mySql)将两行转置为单行(mySql)
【发布时间】:2016-09-29 14:42:23
【问题描述】:

在 MySql 中我有这种表(数据):

我想要做的是在单行(按日期分组)中获取日期、传感器 (1) 的温度、传感器 (2) 的温度。

现在,对于传感器 1 和传感器 2,我有两个相同 dtg 的记录...

谢谢

【问题讨论】:

标签: mysql mysql-workbench


【解决方案1】:

使用GROUP_CONCAT:

SELECT dtg, GROUP_CONCAT(temperature ORDER BY sensor_id)
FROM yourTable
GROUP BY dtg

演示在这里:

SQLFiddle

【讨论】:

  • 好的,但是“group_concat”会连接两个用逗号分隔的值吗?有没有办法获得每个传感器的属性?例如 (dtg,temp1,temp2)?
  • separated atribute for each sensor ...这是什么意思?
  • 现在我有 dtg 属性和 (temp1,temp2) 作为单个属性.. 我想要的是得到 dtg,temp1,temp2(如果可能的话)
  • 您所说的是转置列。开箱即用的 mysql 无法做到这一点,但如果您事先知道 sensor_ids,则可以执行 SELECT COALESCE(IF(sensor_id='x', temperature, NULL)) sensor_x, COALESCE(IF(sensor_id='y', temperature, NULL)) sensor_y 之类的操作
【解决方案2】:

您可以使用self join

SELECT 
    a.dtg AS dtg1,
    a.sensor_id AS sensor_id1,
    a.temperature AS temperature1,
    b.sensor_id AS sensor_id2,
    b.temperature AS temperature2
FROM yourTable AS a
LEFT JOIN yourTable AS b 
    ON a.dtg = b.dtg
    AND NOT a.sensor_id = b.sensor_id
GROUP BY a.dtg

【讨论】:

【解决方案3】:

在查询中硬编码这些值并不理想,但这是将行转置为列的一种解决方法:

SELECT dtg,
    COALESCE(IF(sensor_id='28-000004a9fa09', temperature, NULL)) t1, 
    COALESCE(IF(sensor_id='28-000004aa21cd', temperature, NULL)) t2
FROM readings
GROUP BY dtg

如果您开始获得不可预测的时间读数,您可能需要使用聚合。特别是考虑到 DB18B20 有时可能需要一段时间才能读取,您可能会遇到秒数重叠的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    相关资源
    最近更新 更多