如何在 MYSQL 中将行配对在一起?

2024-01-21

我正在开发一个简单的时间跟踪应用程序。

我创建了一个表来记录员工的进出时间。

以下是我的数据当前外观的示例:

E_ID | In_Out |      Date_Time
------------------------------------
  3  |   I    | 2012-08-19 15:41:52
  3  |   O    | 2012-08-19 17:30:22
  1  |   I    | 2012-08-19 18:51:11
  3  |   I    | 2012-08-19 18:55:52
  1  |   O    | 2012-08-19 20:41:52
  3  |   O    | 2012-08-19 21:50:30

我正在尝试创建一个查询,将员工的 IN 和 OUT 时间配对到一行中,如下所示:

E_ID |       In_Time       |      Out_Time
------------------------------------------------
  3  | 2012-08-19 15:41:52 | 2012-08-19 17:30:22
  3  | 2012-08-19 18:55:52 | 2012-08-19 21:50:30
  1  | 2012-08-19 18:51:11 | 2012-08-19 20:41:52

我希望我清楚地表达了我想要在这里实现的目标。 基本上我想生成一份将进出时间合并为一行的报告。

任何对此的帮助将不胜感激。 提前致谢。


我能想到三种基本方法。

一种方法使用 MySQL 用户变量,一种方法使用 theta JOIN,另一种方法使用 SELECT 列表中的子查询。

西塔-加入

一种方法是使用 theta-JOIN。这种方法是一种通用的 SQL 方法(没有 MySQL 特定的语法),可以与多个 RDBMS 一起使用。

注意:对于大量行,此方法可能会创建非常大的中间结果集,这可能会导致性能问题。

SELECT o.e_id, MAX(i.date_time) AS in_time, o.date_time AS out_time    
  FROM e `o`
  LEFT
  JOIN e `i` ON i.e_id = o.e_id AND i.date_time < o.date_time AND i.in_out = 'I'
 WHERE o.in_out = 'O'
 GROUP BY o.e_id, o.date_time
 ORDER BY o.date_time

其作用是将员工的每个“O”行与之前的每个“I”行进行匹配,然后我们使用 MAX 聚合来挑选具有最接近日期时间的“I”记录。

这适用于完美配对的数据;可能会为不完美的对产生奇怪的结果...(没有中间“I”行的两个连续“O”记录,都将与相同的“I”行匹配,等等)


SELECT 列表中的相关子查询

另一种方法是在 SELECT 列表中使用相关子查询。这可能具有次优性能,但有时是可行的(并且有时是返回指定结果集的最快方法......当我们在外部查询中返回的行数有限时,此方法效果最佳。)

 SELECT o.e_id
      , (SELECT MAX(i.date_time)
           FROM e `i`
          WHERE i.in_out = 'I'
            AND i.e_id = o.e_id
            AND i.date_time < o.date_time
        ) AS in_time
      , o.date_time AS out_time
   FROM e `o`
  WHERE o.in_out = 'O'
  ORDER BY o.date_time

用户变量

另一种方法是利用 MySQL 用户变量。 (这是 MySQL 特定的方法,是“缺失”分析函数的解决方法。)

此查询的作用是先按 e_id 对所有行进行排序,然后按 date_time 排序,以便我们可以按顺序处理它们。每当我们遇到“O”(出)行时,我们都会使用前一个“I”行中的 date_time 值作为“in_time”)

注意:MySQL 用户变量的这种使用取决于 MySQL 按特定顺序(可预测的计划)执行操作。使用内联视图(或 MySQL 术语中的“派生表”)为我们提供了可预测的执行计划。但这种行为可能会在 MySQL 的未来版本中发生变化。

SELECT c.e_id
     , CAST(c.in_time AS DATETIME) AS in_time
     , c.out_time
  FROM (
         SELECT IF(@prev_e_id = d.e_id,@in_time,@in_time:=NULL) AS reset_in_time
              , @in_time := IF(d.in_out = 'I',d.date_time,@in_time) AS in_time
              , IF(d.in_out = 'O',d.date_time,NULL) AS out_time
              , @prev_e_id := d.e_id  AS e_id
           FROM (
                  SELECT e_id, date_time, in_out 
                    FROM e
                    JOIN (SELECT @prev_e_id := NULL, @in_time := NULL) f
                   ORDER BY e_id, date_time, in_out 
                 ) d
       ) c
 WHERE c.out_time IS NOT NULL
 ORDER BY c.out_time

这适用于您拥有的数据集,它需要更彻底的测试和调整,以确保当行未完美配对时(例如,两个“O”行没有“I”行),您可以使用奇怪的数据获得所需的结果集在它们之间,有一个“I”行,没有后续的“O”行,等等)

SQL小提琴 http://sqlfiddle.com/#!2/84342/8

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 MYSQL 中将行配对在一起? 的相关文章

  • 从 SQL 数据库获取日期时间

    我的数据库表中有一个 DateTime 记录 我编写一个查询从数据库中获取它 string command2 select Last Modified from Company Data where Company Name Descrip
  • 从 Presto 中的 JSON 列获取特定值

    我有一个带有 JSON 列的表points其中一行为 0 0 2 1 1 2 2 0 5 15 1 2 20 0 7 我想获取键的值 1 and 20 并将它们存储为别名 例如first and second在查询中 到目前为止我所做的是
  • 如何调试参数化 SQL 查询

    我使用 C 连接到数据库 然后使用 Ad hoc SQL 来获取数据 这个简单的 SQL 查询非常方便调试 因为我可以记录 SQL 查询字符串 如果我使用参数化 SQL 查询命令 有没有办法记录 sql 查询字符串以进行调试 我想就是这样的
  • 在内连接中重用 mysql 子查询

    我正在尝试优化查询 试图避免重复用 指示的查询 复杂查询 使用两次 结果相同 原始查询 SELECT news FROM news INNER JOIN SELECT myposter FROM SELECT COMPLEX QUERY U
  • 如何在php/mysql中使用事务

    我正在使用 php mysql 我知道 mysql 中的事务 但不能在我的脚本中使用 下面是我的脚本 如何在我的代码中使用 php 事务 即 BEGIN ROLLBACK COMMIT foreach json a shop as json
  • PostgreSQL 窗口函数:row_number() over(按 col2 分区 col 顺序)

    以下结果集源自具有一些连接和联合的 SQL 查询 SQL 查询已经对 Date 和 game 上的行进行了分组 我需要一列来描述按日期列分区的游戏的尝试次数 Username Game ID Date johndoe1 Game 1 100
  • 条件对列表的 In 子句

    有一个表 我需要通过在配对值列表中应用和条件来获取分页记录 下面是解释 假设我有一堂课Billoflading其中有各个领域 表中两个重要字段是 tenant billtype 我有一个包含值的对列表 tenant1 billtype1 t
  • 火鸟删除速度很慢

    我正在做这个简单的交易 DELETE FROM ominve01 WHERE CVE OBS IN SELECT CVE OBS FROM minve01 M WHERE M FECHA DOCU lt 31 12 2010 OR FECH
  • 在 SQL 中如何获得整数的最大值?

    我试图从 MySQL 数据库中找出整数 有符号或无符号 的最大值 有没有办法从数据库本身提取这些信息 是否有我可以使用的内置常量或函数 标准 SQL 或 MySQL 特定的 At http dev mysql com doc refman
  • PHP-MySQLi 连接随机失败并显示“无法分配请求的地址”

    大约两周以来 我一直在处理 LAMP 堆栈中最奇怪的问题之一 长话短说 与 MySQL 服务器的随机连接失败并显示错误消息 Warning mysqli real connect HY000 2002 Cannot assign reque
  • value >= all(select v2 ...) 产生与 value = (select max(v2) ...) 不同的结果

    Here https stackoverflow com questions 17026651 query from union of joins 17027784 noredirect 1 comment24611997 17027784
  • 如何选择列值不不同的每一行

    我需要运行一个 select 语句 返回列值不不同的所有行 例如 EmailAddress 例如 如果表格如下所示 CustomerName EmailAddress Aaron email protected cdn cgi l emai
  • 我们可以使用sql列出MS Access数据库中的所有表吗?

    我们可以使用 sql 找到 ms access 中的所有表吗 就像我们在 sql server 中所做的那样 select from sys tables 在sqlite中 SELECT FROM sqlite master where t
  • 更高效的 LINQ 查询

    有人可以帮我将此查询循环变成高效的 Linq 查询吗 我将其加载到 TreeView 中 因此必须附加每个项目 包含也非常低效 延迟加载项目也不起作用 事实上 这个查询访问数据库的次数比应有的要多 public IQueryable
  • DataTables 第 2 页的分页未调用放大弹出窗口

    所以我有这个启用分页的数据表 我编码了一种方式 以便用户可以编辑表的行 当用户调用它在放大弹出窗口中打开的编辑页面时 它在第 1 页 从第 2 页起都运行良好 DataTable 及其前面停止调用 Magnific Popup 我只是不明白
  • 在 Cordova 中合并文件的多个部分

    在我的 Cordova 应用程序中 我正在下载任意文件 例如图像或视频文件 这是通过 Cordova 文件传输插件和 Range 标头完成的 因为我需要分段下载文件 我的问题是 我想将几 个小 字节 文件合并回原来的文件中 他们曾经在其中使
  • 具有“日期之间”的 CakePHP 模型

    我有一个很大的数据集 超过十亿行 数据在数据库中按日期分区 因此 我的查询工具必须在每个查询上指定一个 SQL Between 子句 否则它将必须扫描每个分区 而且 它会在返回之前超时 所以 我的问题是 分区的数据库中的字段是日期 使用 C
  • 什么是更好的?子查询或内连接十个表?

    一个旧系统已抵达我们的办公室进行一些更改和修复 但它也存在性能问题 我们并不确切知道这种缓慢的根源是什么 当我们重构旧代码时 我们发现了几个具有以下模式的 sql 查询 出于示例目的 简化了查询 SELECT SELECT X FROM A
  • Postgres 按查询分组

    我正在尝试在 postgres 的查询中使用 group by 我无法让它按照我想要的方式工作 以便根据需要对结果进行分组 这是另一个堆栈问题的扩展我刚刚回答过的递归查询 https stackoverflow com questions
  • mysql 查询选择当月的所有行?

    我有一个名为 startdate 的日期时间类型的列 我必须获取当前月份的开始日期和结束日期之间的所有行 即从 1 11 2014 到 30 11 2014 select from your table where year curdate

随机推荐

  • 本地化字符串比较

    有什么区别NSString s localizedCaseInsensitiveCompare and localizedStandardCompare 方法 我阅读了参考资料 但不知道该使用哪一个 localizedCaseInsensi
  • PHP OOP 数据库问题

    我正在使用 DB 类中的 get 函数从数据库查询用户名 即使数据库中存在用户 它也总是返回 无用户 这是我的 DB php
  • 如何旋转 ImageView?

    我想在我的 Activity 中以编程方式旋转 ImageView 目前我找不到任何适用于 Xamarin 的解决方案 并且 Android 的翻译解决方案也不起作用 有人知道如何旋转 ImageView 吗 例如 这段代码只是给了我一个
  • 如何在Android中使用Java邮件将应用程序电子邮件同步到服务器电子邮件?

    我想同步更改电子邮件应用程序中的更改 然后自动更改服务器电子邮件中的更改 例如 我已阅读电子邮件应用程序上的未读消息 然后自动服务器电子邮件将未读邮件更改为已读邮件 我的电子邮件应用程序使用邮件 jar 文件 activation jar
  • Airflow dags 生命周期事件

    我正在尝试通过java后端管理气流dags 创建 执行等 目前 在创建 dag 并将其放入气流的 dags 文件夹中之后 我的后端不断尝试运行 dag 但在气流调度程序接收到它之前它无法运行它 如果 dag 的数量较多 这可能需要相当长的时
  • Eslint:函数体括号的换行规则(类似于 object-curly-newline)?

    我希望函数体的括号有新行 const fn gt new line here new line before 同样适用于function We have https eslint org docs latest rules object c
  • 如何在elasticsearch启动时加载索引模板文件?

    在elasticsearch v1 5中 索引模板可以放置在templates目录下的配置位置 path conf 中elasticsearch config templates 但是 我发现升级到v2 3或v5 3后 这个模板将不会被加载
  • 获取Datalist中选定的项目值

    我在数据列表中使用 ImageButton 并希望将所选项目值存储在变量中以进一步处理它 如何在单击按钮时获取数据 我需要的数据是 Productid 名称 价格等 有什么帮助吗 数据列表的代码是
  • 具有单字母扩展名的 C++ 头文件有什么特别之处?

    C 标准在第 16 2 节 源文件包含 中包含以下规则 它以某种方式使单字符文件扩展名变得特殊 该实现应为由一个或多个组成的序列提供唯一的映射非数字 or digits 2 11 后跟一个句点 和一个单一的nondigit 第一个字符不能是
  • WPF TreeView 虚拟化

    我正在尝试弄清楚这个虚拟化功能 我不确定我是否理解错误或发生了什么 但我正在使用 ANTS 内存分析器来检查虚拟化 TreeView 中的项目数 并且它只是不断增加 我有一个包含 1 001 个项目 1 个根项目 1000 个子项目 的 T
  • Scipy:凸包的质心

    如何使用 python 和 scipy 计算凸包的质心 我找到的只是计算面积和体积的方法 问候 弗兰克 假设您已经使用以下方法构建了凸包scipy spatial ConvexHull 返回的对象应该具有点的位置 因此质心可能很简单 imp
  • 为什么我无法在 Python 中两次登录 imap 服务器

    正如下面的错误消息所示 我无法登录 因为我处于 LOGOUT 状态而不是 NONAUTH 状态 如何从 LOGOUT 转到 NONAUTH 下面的示例 显然下面的登录凭据是伪造的 Python 2 7 3 default Aug 1 201
  • 在引发它订阅的异步事件后,对象是否会自动释放?

    假设我有一个可以从主线程调用多次的函数 每次被调用时 我都会创建一个WebClient对象异步下载一些数据 我的问题 这样做安全吗 是个WebClient调用事件后释放对象 如果内存不会自动释放 我不想继续分配内存 我的应用程序适用于带有
  • 将线段延长特定距离

    我正在尝试找到一种将线段延长特定距离的方法 例如 如果我有一条从 10 10 开始延伸到 20 13 的线段 并且我想将长度延长 3 如何计算新端点 在这个例子 10 44 中 我可以通过 sqrt a 2 b 2 获得长度 所以如果我想知
  • 将 eclipse .project 文件存储在项目目录之外

    我不知道这是否可能 因为该文件不包含任何相关的目录链接 但无论如何 我想将 project 文件存储在项目根目录之外的单独目录中 我怎样才能做到这一点 您不能将 project 放在项目根目录之外 因为项目根目录是 project 所在的文
  • 更改立方体一面的颜色 - THREE.js

    我在使用 Three js 的同时学习 OOP 我知道 这是一个很难做到的方法 所以我在场景中创建了一个盒子 现在我想改变那个立方体的一个面的颜色 var scene new THREE Scene var camera new THREE
  • 我们可以使用 JSON 作为数据库吗?

    我正在寻找快速高效的数据存储来构建我的基于 PHP 的网站 我知道MySql 我可以在服务器根目录中使用 JSON 文件来代替 MySQL 数据库吗 如果是 最好的方法是什么 您可以使用任何单个文件 包括 JSON 文件 如下所示 以某种方
  • 在Asp.Net Core中,如何从正文中获取多部分/表单数据?

    在 Asp Net Core 中 他们似乎已经废除了Request Content ReadAsMultipartAsync有利于 IFormFile 的功能 这使得在拥有实际文件的情况下上传变得更加容易 但是 我有一个用例 我需要将文件上
  • Ionic Cordova SQLite 插件错误无法读取未定义的属性“openDatabase”

    我在 ngCordova 插件 cordovaSQLite 中遇到 1 个问题 下面的代码 var db cordovaSQLite openDB name myDB db 我在用着ionic serve在浏览器中 Error Uncaug
  • 如何在 MYSQL 中将行配对在一起?

    我正在开发一个简单的时间跟踪应用程序 我创建了一个表来记录员工的进出时间 以下是我的数据当前外观的示例 E ID In Out Date Time 3 I 2012 08 19 15 41 52 3 O 2012 08 19 17 30 2