我正在处理一个查询,它要求尽可能通用以便重用。
查询涉及分组方式。
但是我不能指定列,因为我需要它是通用的。
查询目的:
使用日期列为每行指定时间键。
然后,我使用group by只获取该组的几个值。
基本上我想做的就是减少一天的分数。
所以,如果一天有4个点,我使用group by将相同的点减少到一天2个点,然后选择相同的点来创建一个新的db。
查询
SELECT * FROM
(SELECT h.* FROM testdb h
WHERE h.date <= '2016-01-02 23:30:00'
GROUP BY FLOOR(UNIX_TIMESTAMP(h.date)/((1440/2)*60))
UNION
SELECT c.* FROM testdb c
WHERE c.date> '2016-01-02 23:30:00') m;
我可以在mysql v5.7及更高版本中运行上述查询,方法是禁用only_full_group_by模式。
当我这样做时,查询结果会发生变化。
mysqlmysql>5.7(禁用full group by)结果为18行。
我的怀疑是:
为什么结果集是变化的,group by在我的例子中不应该改变结果。
有什么办法可以在不禁用完全分组的情况下实现相同的功能?
我读过关于mysql的任何信息,但同样,它不适用于
SELECT ANY_VALUE(*)
需要有关如何实现上述目标的帮助:)
谢谢你
更新1
本地计算机:
SQL版本
5.7.24条
SQL模式:
严格的事务表,没有日期,没有日期,错误,没有自动创建用户,没有引擎替换
有疑问的问题:
SELECT * FROM
(SELECT h.* FROM testdb h
WHERE h.date <= '2016-01-02 23:30:00'
GROUP BY FLOOR(UNIX_TIMESTAMP(h.date)/((1440/2)*60))
UNION
SELECT c.* FROM testdb c
WHERE c.date> '2016-01-02 23:30:00') m;
复制问题的步骤:
CREATE TABLE testdb ( id int primary key auto_increment,date timestamp);
INSERT INTO testdb (date) VALUES ('2015-12-31 00:00:00');
INSERT INTO testdb (date) VALUES ('2015-12-31 06:00:00');
INSERT INTO testdb (date) VALUES ('2015-12-31 18:00:00');
INSERT INTO testdb (date) VALUES ('2016-01-01 00:00:00');
INSERT INTO testdb (date) VALUES ('2016-01-01 06:00:00');
INSERT INTO testdb (date) VALUES ('2016-01-01 18:00:00');
INSERT INTO testdb (date) VALUES ('2016-01-02 00:00:00');
INSERT INTO testdb (date) VALUES ('2016-01-02 06:00:00');
INSERT INTO testdb (date) VALUES ('2016-01-02 18:00:00');
INSERT INTO testdb (date) VALUES ('2016-12-31 00:00:00');
INSERT INTO testdb (date) VALUES ('2016-12-31 06:00:00');
INSERT INTO testdb (date) VALUES ('2016-12-31 06:01:00');
INSERT INTO testdb (date) VALUES ('2016-12-31 12:00:00');
INSERT INTO testdb (date) VALUES ('2016-12-31 18:00:00');
INSERT INTO testdb (date) VALUES ('2017-01-01 00:00:00');
INSERT INTO testdb (date) VALUES ('2017-01-01 06:00:00');
INSERT INTO testdb (date) VALUES ('2017-01-01 18:00:00');
INSERT INTO testdb (date) VALUES ('2017-01-02 00:00:01');
INSERT INTO testdb (date) VALUES ('2017-01-02 06:00:00');
INSERT INTO testdb (date) VALUES ('2017-01-02 18:00:00');
查询结果:
18行
分贝小提琴
https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=6082783c8a2c8ab1aa5cb5849bfcb06f
SQL版本
5.7.26条
SQL模式
严格的事务表,没有日期,没有日期,错误,没有自动创建用户,没有引擎替换
查询结果:
17行
最佳答案
这似乎可以满足您的需要:
SELECT COUNT(*)
FROM (SELECT FLOOR(UNIX_TIMESTAMP(h.date)/((1440/2)*60)) FROM testdb h
WHERE h.date <= '2016-01-02 23:30:00'
GROUP BY FLOOR(UNIX_TIMESTAMP(h.date)/((1440/2)*60))
UNION
SELECT c.date
FROM testdb c
WHERE c.date> '2016-01-02 23:30:00'
) m;