首页 > 解决方案 > 在给定应用程序名称和时间戳的mysql中计算在应用程序上花费的时间

问题描述

我有一个存储活动窗口标题和应用程序名称和时间戳的 mysql 表。

我正在尝试编写 sql 查询以了解按 appname 或窗口标题分组的用户花费了多少时间

我对如何实现感到困惑,因为我需要分组并添加时差,直到我点击新的应用程序名称或窗口标题。

请帮助编写 sql 查询以实现我的目标

表的结构。是

1589972898969 | com.apple.Terminal | electron-quick-start
1589972893157 | com.google.Chrome  | Stafoverflow.com

的HTML

<table>
<tr><th>timestamp</th><th>appname</th><th>title</th></tr>
<tr>
<td>1589978510857</td>
<td>
FROM_UNIXTIME() Examples – MySQL | Database.Guide</td><td>com.apple.Terminal</td>
</tr>

<tr>
<td>1589978507916</td>
<td>
FROM_UNIXTIME() Examples – MySQL | Database.Guide</td><td>com.apple.Terminal</td>
</tr>

<tr>
<td>1589978501832</td>
<td>
FROM_UNIXTIME() Examples – MySQL | Database.Guide</td><td>com.apple.Terminal</td>
</tr>

<tr>
<td>1589979493016</td>
<td>
Calculating time spent on an app in mysql given name of the app and timestamp - Stack Overflow </td><td>com.google.Chrome</td>
</tr>

</table>

标签: mysql

解决方案


你可以这样做:

SELECT *, MAX(time), MIN(time), MAX(time) - MIN(time) time_diff FROM (

    SELECT  @c := @c + (@appname != appname) AS cn,
                @appname := appname AS an,
                t.*
        FROM    (
                SELECT  @c := 0,
                        @appname := 0
                ) vars,
                test t
        ORDER BY `time` ASC
    ) sorted GROUP BY cn

要测试的表:

CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `time` timestamp NULL DEFAULT NULL,
  `appname` varchar(50) DEFAULT NULL,
  `title` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `test` (`id`, `time`, `appname`, `title`)
VALUES
    (1,'2020-05-20 13:14:38','test','jhkjgh'),
    (2,'2020-05-20 13:15:11','test','skdljbhj'),
    (3,'2020-05-20 13:18:11','test',NULL),
    (4,'2020-05-20 14:24:38','test2','jhkjgh'),
    (5,'2020-05-20 14:55:31','test1','skdljbhj'),
    (6,'2020-05-20 15:38:11','test1',NULL),
    (7,'2020-05-20 18:24:38','test2','jhkjgh'),
    (8,'2020-06-20 09:55:31','test2','skdljbhj'),
    (9,'2020-05-10 05:38:11','test2',NULL);

我用时间戳做到了,你可以改变它。您也可以添加您喜欢的任何分组。


推荐阅读