我正在创建一款员工跟踪应用程序.

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

ID PersonID TypeID DateTime
1 001 IN 2022-09-01T13:21:12
2 001 OUT 2022-09-01T13:25:12
3 001 IN 2022-09-01T14:21:12
4 001 OUT 2022-09-01T14:25:12
5 002 IN 2022-09-03T13:21:12
6 002 OUT 2022-09-03T13:25:12
7 002 IN 2022-09-03T14:21:12
8 002 IN 2022-09-03T14:25:12
9 002 OUT 2022-09-03T14:25:12
10 002 OUT 2022-09-03T16:25:12
11 002 OUT 2022-09-03T17:25:12
12 002 IN 2022-09-04T16:25:12
13 002 IN 2022-09-05T17:25:12

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

大概是这样的:

PersonID InID In_DateTime OutID 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 null null
002 8 2022-09-03T14:25:12 9 2022-09-03T14:25:12
002 null null 10 2022-09-03T16:25:12
002 null null 11 2022-09-03T17:25:12
002 12 2022-09-04T16:25:12 null null
002 13 2022-09-05T17:25:12 null null

有人知道如何在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);

See the demo.

Mysql相关问答推荐

括号在SQL查询中的作用?

在联合查询中使用GROUP BY和ORDER BY

MySQL:获取连续记录的数量(日期)?

Mysql - 按周分组但从 1 开始计数

SQL 查询仅当成员共享确切值时才 Select 成员对

使用 SELECT 时应锁定多少行 .. FOR UPDATE LIMIT 1

如何使用mysql更新列中的json数据

try 在 .map 中使用 Favorite 选项卡进行react .我无法更改 mysql 表上的布尔类型

go&mysql&docker 拒绝连接

MySQL 使用了错误的索引

MySQL如何在小时和分钟之间 Select 时间

MySql中的可见索引和不可见索引是什么

如何判断嵌套查询返回的元组中的每个条目是否相同?

MySQL函数查找两个日期之间的工作日数

在 Android 上运行 AMP (apache mysql php)

哪个更好 - 许多小桌子或一张大桌子?

在 Mac 上设置 Laravel php artisan migrate 错误:没有这样的文件或目录

从 MySQL JSON 数据类型中提取不带引号的值

为什么在 MySQL 中使用外键约束?

我在哪里可以下载 mysql jdbc jar?