mysql - 如何创建将行转换为列的 MySQL 查询?

标签 mysql time-series case window-functions gaps-and-islands

我正在创建一个员工跟踪应用。

我有一个 MySQL 表,如下所示:

<表类="s-表"> <头> 身份证 个人ID 类型ID 日期时间 <正文> 1 001 在 2022-09-01T13:21:12 2 001 结束 2022-09-01T13:25:12 3 001 在 2022-09-01T14:21:12 4 001 结束 2022-09-01T14:25:12 5 002 在 2022-09-03T13:21:12 6 002 结束 2022-09-03T13:25:12 7 002 在 2022-09-03T14:21:12 8 002 在 2022-09-03T14:25:12 9 002 结束 2022-09-03T14:25:12 10 002 结束 2022-09-03T16:25:12 11 002 结束 2022-09-03T17:25:12 12 002 在 2022-09-04T16:25:12 13 002 在 2022-09-05T17:25:12

我想创建一个 View ,返回首先按 PersonID 排序然后按 ID 排序的记录,但将行转换为列。

像这样:

<表类="s-表"> <头> 个人ID InID In_DateTime 输出ID Out_DateTime <正文> 001 1 2022-09-01T13:21:12 2 2022-09-01T13:25:12 001 3 2022-09-01T14:21:12 4 2022-09-01T14:25:12 002 5 2022-09-03T13:21:12 6 2022-09-03T13:25:12 002 7 2022-09-03T14:21:12 空 空 002 8 2022-09-03T14:25:12 9 2022-09-03T14:25:12 002 空 空 10 2022-09-03T16:25:12 002 空 空 11 2022-09-03T17:25:12 002 12 2022-09-04T16:25:12 空 空 002 13 2022-09-05T17:25:12 空 空

有人知道如何在 MySQL 中执行此操作吗?

感谢您的任何建议。

最佳答案

使用窗口函数 LEAD()LAG() 为每一行获取其对行,具体取决于其 TypeID 并执行结果与表的左连接:

WITH cte AS (
  SELECT *, 
     CASE 
       WHEN TypeID = 'IN' AND LEAD(TypeID) OVER w = 'OUT' THEN LEAD(ID) OVER w
       WHEN TypeID = 'OUT' AND LAG(TypeID) OVER w = 'IN' THEN LAG(ID) OVER w
     END other_ID  
  FROM tablename
  WINDOW w AS (PARTITION BY PersonID ORDER BY DateTime)
)
SELECT DISTINCT c.PersonID,
       CASE WHEN c.TypeID = 'IN' THEN c.ID ELSE t.ID END InID,
       CASE WHEN c.TypeID = 'IN' THEN c.DateTime ELSE t.DateTime END In_DateTime,
       CASE WHEN c.TypeID = 'IN' THEN t.ID ELSE c.ID END OutID,
       CASE WHEN c.TypeID = 'IN' THEN t.DateTime ELSE c.DateTime END Out_DateTime
FROM cte c LEFT JOIN tablename t
ON t.ID = c.other_ID
ORDER BY c.PersonID, COALESCE(In_DateTime, Out_DateTime);

参见 demo .

关于mysql - 如何创建将行转换为列的 MySQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73652231/

相关文章:

mysql - 在 MariaDB 中设置无限超时 GET_LOCK()

python - 将多天的数据叠加在一起

mysql - 函数中的 SQL Case 语句

mysql - SQL求和函数(意外的SUM_SYM,期望END_OF_INPUT))

java - 参数索引超出范围(1 > 参数个数,即 0)

mysql - 带有日期和序列字段的 SQL 查询

r - 使用纵向数据集计算随时间变化的百分比

MySQL View检查数据是否为NULL

mysql - mysql中相同字段的查询

python Pandas : How to calculate elapsed time between spans?