首页 > 解决方案 > MySQL 8:如何从 FK 创建列?

问题描述

[上下文] 我需要在记录该机器状态更改的表中返回描述所有机器当前状态的行:

原始数据:

时间戳 机器编号 fkDataType 数据价值
2021-02-17 23:28:28 1001 8 错误的
2021-02-17 23:28:28 1001 6 错误的
2021-02-17 23:28:28 1001 2 O9009
2021-02-17 23:28:28 1001 5 1
2021-01-14 00:44:02 2001年 9 测试消息

数据类型:

ID 数据类型名称
1 模式
2 程序
3 零件计数
4 部分目标
5 托盘
6 有警报
7 报警内容
8 有消息
9 消息内容

目前,我有一个查询,可以获取每台机器的每种数据类型的最新数据,但我不知道如何将每种数据类型放在自己的列中。

WITH ranked AS (
    SELECT t1.MachineName, fkNodeID as MachineID, DataValue, fkDataType as DataType, ROW_NUMBER() 
    OVER (PARTITION BY fkDataType, fkNodeID ORDER BY id DESC) AS Recency
    FROM MachineData.Transactions
    INNER JOIN (
        SELECT MachineID, MachineName FROM MachineData.Machines
    ) t1 WHERE t1.MachineID = fkNodeID
)
SELECT * FROM ranked WHERE Recency = 1
ORDER BY MachineID, DataType

我的查询示例:

机器名称 ID 数据价值 fkDataType 新近度
远州GE480H 1001 记忆 1 1
远州GE480H 1001 O9009 2 1
远州GE480H 1001 167 3 1
远州GE480H 1001 200 4 1
远州GE480H 1001 1 5 1
远州GE480H 1001 错误的 6 1
远州GE480H 1001 “” 7 1
远州GE480H 1001 错误的 8 1
远州GE480H 1001 “” 9 1
ESP32 2001年 测试消息 9 1

期望的输出:

机器名称 ID 模式 程序 零件计数 ...
远州GE480H 1001 记忆 O9009 167 ...
ESP32 2001年 无效的 无效的 无效的 ...

我不知道如何做到这一点。任何帮助,将不胜感激。[MySQL 版本:8.0]

标签: mysqlsqlpivot-tableentity-attribute-value

解决方案


推荐阅读