【问题标题】:Create mysql sum column when multiple other columns are true当多个其他列为真时创建mysql总和列
【发布时间】:2018-08-31 13:55:43
【问题描述】:

我想在 mysql 工作台中创建一个列,其中有多个列(例如条件、试验、主题、行为类型)的 行为持续时间 ...) 是相同的。

我对使用 sql 工作比较陌生,到目前为止,我大多只使用它来提取数据。这是可能的吗?如果是这样,我该怎么做?

谢谢:)

编辑 - 数据会是这样的

Condition  Trial   Group  Subject  Behaviour  Duration   **TotalDuration**  
np         1       XX     GBF132   interact   00:00:42  
np         1       XX     GBF132   interact   00:00:17   
yp         1       ZZ     HJR543   interact   00:01:03            
yp         1       ZZ     HJR543   interact   00:00:26  

因此,同一个人在一次试验中可能有多次互动,我想确定每次试验的总体互动持续时间。

但我在每个试验和条件下有多个受试者/行为/组,因此需要一种方法来轻松计算在条件、试验、组、主题、行为相同时每个行为的总持续时间。

我希望这能让它更清楚!

【问题讨论】:

  • 您能否提供一个您拥有的数据示例以及您期望从中获得的结果示例?我刚刚意识到你想总结什么价值观有点不清楚。
  • 感谢您的回复!我已经编辑了这篇文章,希望让它更清晰:)

标签: mysql if-statement sum mysql-workbench


【解决方案1】:

AFAIK 在最近的 MySQL 版本中添加了对窗口函数的支持。看来这些功能可以用来解决你的问题。我没有测试它,但它会有点像这样使用:

SELECT
  `condition`, `trial`, `group`, `subject`, `behaviour`,
  `duration`,
  SEC_TO_TIME(SUM(TIME_TO_SEC(`duration`))) OVER (PARTITION BY condition`, `trial`, `group`, `subject`, `behaviour`) AS timeSum
FROM `tests`;

无论如何,对于旧版本的 MySQL,以下可能对您有用:

SELECT
   `condition`,
   `trial`,
   `group`,
   `subject`,
   `behaviour`,
   `duration`, SEC_TO_TIME(SUM(TIME_TO_SEC(`duration`)))
FROM `tests`
GROUP BY `condition`, `trial`,`group`, `subject`,`behaviour`;

但是那样你会失去“细节”。要复制窗口函数的工作方式,您需要使用以下内容:

SELECT `t1`.`condition`, `t1`.`trial`,`t1`.`group`, `t1`.`subject`,`t1`.`behaviour`, `t2`.`duration`,`t1`.`totalTime` FROM (SELECT
  `condition`,
  `trial`,
  `group`,
  `subject`,
  `behaviour`,
  `duration`, SEC_TO_TIME(SUM(TIME_TO_SEC(`duration`))) AS totalTime
FROM `tests` AS subt1
GROUP BY `condition`, `trial`,`group`, `subject`,`behaviour`) AS t1
JOIN `tests` AS t2 USING (`condition`, `trial`,`group`, `subject`,`behaviour`);

这是我玩过的代码 sn-p:http://sqlfiddle.com/#!9/e002f2/12/0

【讨论】:

  • 您为什么认为conditiontrial 应该等于true (=1)?
  • 因为问题标题声明“......当多个其他列为真时”。无论如何,将条件变为相互​​平等并不难。现在,当作者编辑她的问题时,我的回答完全失去了意义:)
  • 太棒了!太感谢了!第三个例子对我来说非常有效。快速提问如何格式化“totalTime”列的时间,因为我的时间是 hh:mm:ss.000,而此刻我正在失去毫秒。我试过: TIME_FORMAT(t1.TotalTime, '%H:%i:%s.%f') AS TotalDuration 但是毫秒数只是 0 谢谢 :)
  • 我做了一点调查,很抱歉,在 MySQL 中以毫秒精度处理时间本身就是一个复杂的挑战 (stackoverflow.com/questions/2572209/…)。我的答案中使用的 SEC_TO_TIME 和 TIME_TO_SEC 只能以较低的精度处理时间。
  • 我使用的是 mySQL 工作台 6.3。是的,在我的持续时间内,它们有毫秒,列数据类型设置为 TIME(3)。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
相关资源
最近更新 更多