我有以下内容:
date
-Unix时间戳。我正在努力实现以下目标:
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。