MySQl MariaDB组时间戳记(按点)

时间:2019-06-04 11:11:12

标签: mysql sql group-by mariadb unix-timestamp

我有以下内容:

    每天收集的
  • 数据点以及相关的date-Unix时间戳。

我正在努力实现以下目标:

  • 每天过滤数据点。,即假设我每天有4个数据点,我正尝试使用n将其减少到每天GROUP BY个数据点。 / li>

我正在使用以下查询:

    SELECT *,FLOOR(UNIX_TIMESTAMP(date)/((1440/n)*60))    
    AS timekey 
    FROM  `tbl`
    where date < 'date'  
    GROUP BY timekey)m
    UNION
    (SELECT * ,0 As timekey FROM  `tbl` 
    where date > 'date'  );

根据我的说法,这应该为日期为

n确定要分组的点数。

然后,GROUP BY最终将减少关于n的数据点的数量。

  

以上查询适用于具有超过20000 rows的表。

     

对于n=2,将指定date之前的数据点减少到2点(从4减少到2行)。

以下是创建脚本:

CREATE TABLE `tbl_a` (
  `id` int(25) NOT NULL AUTO_INCREMENT,
  `pid` bigint(11) NOT NULL,
   ---
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
   ---
   PRIMARY KEY (`id`),
   UNIQUE KEY `phase_id_2` (`phase_id`,`date`),
   KEY `id` (`id`,`pid`),
   KEY `date` (`date`)
) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

该查询在上表中非常有效。

但是,当我对行数较少的另一个数据库尝试相同的查询时,它无法按预期工作。

它仅减少查询中指定的日期,其余部分保持不变。

  

。即仅查询中与给定日期相对应的行   通过查询减少,其余行保持不变。

测试表创建脚本:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
   `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `date` (`date`)
)  ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

这是索引错误还是数据库引擎异常?

重新创建问题的步骤:
  创建测试tbl:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
   `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `date` (`date`)
)  ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

插入数据:

INSERT INTO test (date) VALUES ('2015-11-01 00:00:00');  
INSERT INTO test (date) VALUES ('2015-11-01 06:00:00');  
INSERT INTO test (date) VALUES ('2015-11-01 12:00:00');   
INSERT INTO test (date) VALUES ('2015-11-01 18:00:00');   
INSERT INTO test (date) VALUES ('2016-11-01 00:00:00');  
INSERT INTO test (date) VALUES ('2016-11-01 06:00:00');  
INSERT INTO test (date) VALUES ('2016-11-01 12:00:00');  
INSERT INTO test (date) VALUES ('2016-11-01 18:00:00');   
INSERT INTO test (date) VALUES ('2016-11-02 00:00:00');  
INSERT INTO test (date) VALUES ('2016-11-02 06:00:00');  
INSERT INTO test (date) VALUES ('2016-11-02 12:00:00');   
INSERT INTO test (date) VALUES ('2016-11-02 18:00:00');  
INSERT INTO test (date) VALUES ('2017-11-02 00:00:00');  
INSERT INTO test (date) VALUES ('2017-11-02 06:00:00');  
INSERT INTO test (date) VALUES ('2017-11-02 12:00:00');    
INSERT INTO test (date) VALUES ('2017-11-02 18:00:00');  

运行查询:

 SELECT * FROM
    (SELECT *,FLOOR(UNIX_TIMESTAMP(date)/((1440/2)*60))    
    AS timekey 
    FROM  `test`
    where date < '2017-11-02'  
    GROUP BY timekey) m
    UNION
    (SELECT * ,0 As timekey FROM  `test` 
    where date > '2017-11-02');

以上内容应:

  • 减少2017-11-02之前的所有数据点,其结果应为10。

0 个答案:

没有答案