【问题标题】:MySQL Query to Subtract 1st column of 1st row with 2nd column of 2nd rowMySQL查询以减去第一行的第一列和第二行的第二列
【发布时间】:2019-02-02 11:31:03
【问题描述】:

我正在为一个 Mysql 代码而苦苦挣扎,我不知道如何解决这个问题。我有两列时间值,我在 Mysql 查询结果中按 desc 排序。

我需要找出第 2 行 StateEndTime 和第 1 行 StateStartTtime 之间的差异,以此类推,并将其显示在新的行/列中。决赛桌应该是这样的:

ID          Type         StateStarTtime    StateEndTime   Min Difference

xxx         YYY          03:57             03:59          00:02
xxx         ZZZ          03:53             03:55          00:04
xxx         ZZZ          03:46             03:49          

【问题讨论】:

  • 所以,每一行都有 StateStartTime 和 StateEndTime 并且您需要为每一行计算一个列,即该行的 StateStartTime - 下一行的 StateEndTime?
  • 是的。你是对的。
  • 这是您在过去 2 天内第三次问此问题。如果你没有得到答案,那么这是一个糟糕的问题。您可以通过在问题中提供示例数据和预期输出作为文本来改进此问题。我怀疑您可能需要使用行号模拟(版本 8 之前)或 row_number 窗口函数(版本 8 及更高版本)作为起点来生成行号。
  • 我查看了您以前的帖子,没有我只能看到的源数据,因为这个问题“这里是查询的结果”需要做更多的工作。
  • @P.Salmon 是正确的,理想情况下您应该提供示例数据和预期结果。 Yatendra singh ranawat 理想情况下你应该看看Why should I provide an MCVE for what seems to me to be a very simple SQL query?

标签: mysql


【解决方案1】:

假设 ID 是一个自增列,这可以在 MySQL 中通过自连接技术实现:

 SELECT 
  t1.ID,
  t1.Type,
  t1.StateStartTime,
  t1.StateEndTime
  (t1.StateStartTime - t2.StateEndTime) AS Min_Diff
 FROM
 Table1 t1
    INNER JOIN
 Table1 t2 ON t2.id = t1.id + 1

【讨论】:

  • 即使是自动增量,这也不是一个很好的解决方案,如果一行被删除,它可能会全部被丢弃。
【解决方案2】:

这可以在带有 CTE 和/或 ROW_NUM 函数的 MYSQL 8 中进行简化,但这将有助于在大多数版本中获得您所追求的解决方案。

我还在示例中输入了您的时间,但它们的格式不正确,您的实际数据可能并非如此。

SET @row_number_a = 0;
SET @row_number_b = -1;

SELECT a.id, a.type, a.start, a.end, TIMEDIFF(CAST(a.start AS TIME), CAST(b.end AS TIME)) AS DIFF  
FROM
(SELECT (@row_number_a:=@row_number_a + 1) AS num, id, type, start, end
FROM tbl) a

LEFT JOIN (
SELECT (@row_number_b:=@row_number_b + 1) AS num, id, type, start, end
FROM tbl
) b
ON a.num = b.num

结果:

"id"    "type"  "start" "end"   "DIFF"
"xxx"   "YYY"   "03:57" "03:59" "00:02:00"
"xxx"   "ZZZ"   "03:53" "03:55" "00:04:00"
"xxx"   "ZZZ"   "03:46" "03:49" \N

【讨论】:

  • 我有 MySQL 版本 10.1.36-MariaDB
  • 不太确定 mariadb -> mysql 版本可比性。
  • @yatendrasinghranawat 怎么没有显示正确的结果,我复制了你的例子和你的输出,那是 sql 做的吗?您可能需要编辑您的问题
  • 显示的时差不正确截图供您参考ibb.co/vwZ3wffibb.co/NCKCtsgibb.co/61YBjQP
  • 你的问题没有提到任何关于按 emp.id 拆分它的内容。展示您使用的实际架构以及您想要实现的目标。
【解决方案3】:

这是你想要做的吗?

  mysql_query("SELECT *, `StateEndTime`-`StateStarTtime` AS `Min Difference` 
  FROM `TableName`");

【讨论】:

  • 每一行都有 StateStartTime 和 StateEndTime,我需要为每一行计算一个列,即该行的 StateStartTime - 下一行的 StateEndTime
猜你喜欢
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
相关资源
最近更新 更多