如何在 MySQL 中创建秒列表

发布于 2024-09-11 20:40:55 字数 270 浏览 6 评论 0原文

我有以下查询:

  SELECT timestamp,
         COUNT(*)
    FROM table
GROUP BY timestamp

但有些时间戳没有显示,因为没有数据。这是一个示例

1:00:00 |  3
1:00:02 | 17
1:00:03 |  2

请注意,缺少 1:00:01。有没有办法让 1:00:01 |结果中出现0

I have the following query:

  SELECT timestamp,
         COUNT(*)
    FROM table
GROUP BY timestamp

But some timestamps do not show up because there is no data. Here's an example

1:00:00 |  3
1:00:02 | 17
1:00:03 |  2

Notice that 1:00:01 is missing. Is there a way to make the 1:00:01 | 0 appear in the result?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

扭转时空 2024-09-18 20:40:55

MySQL 没有递归功能,因此您只能使用 NUMBERS 表技巧 -

  1. 创建一个仅保存递增数字的表 - 使用 auto_increment 很容易做到:

    如果存在`example`则删除表。`numbers`;
    创建表“示例”。“数字”(
      `id` int(10) 无符号 NOT NULL 自动增量,
       主键(`id`)
    ) 引擎=InnoDB 默认字符集=latin1;
    
  2. 使用以下方式填充表:

    插入数字
      (ID)
    价值观
      (无效的)
    

    ...您需要的任意数量的值。

  3. 使用DATE_ADD< /a> 构建时间列表,根据 NUMBERS.id 值增加秒数:

    <前><代码>选择 x.*
    FROM (SELECT DATE_FORMAT(DATE_ADD('2010-01-01', INTERVAL n.id - 1 SECOND), '%T')
    来自数字 n) x

  4. 根据时间部分 LEFT JOIN 到数据表:

     SELECT x.ts AS 时间戳,
              COALESCE(COUNT(y.timestamp), 0) AS cnt
         FROM (SELECT DATE_FORMAT(DATE_ADD('2010-01-01', INTERVAL n.id - 1 SECOND), '%T') AS ts
                 来自数字 n) x
    左连接表 y ON y.timestamp = x.ts
     按 x.ts 分组
    

MySQL doesn't have recursive functionality, so you're left with using the NUMBERS table trick -

  1. Create a table that only holds incrementing numbers - easy to do using an auto_increment:

    DROP TABLE IF EXISTS `example`.`numbers`;
    CREATE TABLE  `example`.`numbers` (
      `id` int(10) unsigned NOT NULL auto_increment,
       PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
  2. Populate the table using:

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...for as many values as you need.

  3. Use DATE_ADD to construct a list of times, increasing the seconds based on the NUMBERS.id value:

    SELECT x.*
      FROM (SELECT DATE_FORMAT(DATE_ADD('2010-01-01', INTERVAL n.id - 1 SECOND), '%T') 
              FROM numbers n) x
    
  4. LEFT JOIN onto your table of data based on the time portion:

       SELECT x.ts AS timestamp,
              COALESCE(COUNT(y.timestamp), 0) AS cnt
         FROM (SELECT DATE_FORMAT(DATE_ADD('2010-01-01', INTERVAL n.id - 1 SECOND), '%T') AS ts
                 FROM numbers n) x
    LEFT JOIN TABLE y ON y.timestamp = x.ts
     GROUP BY x.ts
    
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文