Работя върху заявка, която изисква да бъде възможно най-универсална за повторна употреба. Заявката включва GROUP BY.
Въпреки това не мога да посоча колоните, тъй като трябва да бъдат универсални.
Цел на заявката:
- Присвоява ключ за време на всеки ред, като използва колоната за дата.
- След това използвам GROUP BY, за да получа само няколко стойности на групата.
- По принцип това, което искам да направя, е да намаля броя на точките за даден ден.
- Така че, ако има да речем 4 точки на ден, използвам GROUP BY, за да намаля същото до 2 точки на ден и след това да избера същото в нова база данни.
Заявка
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. Когато направя това, резултатът от заявката варира.
Резултатът от MySQL ‹5.7 е 17 реда.
MySQL >5.7 (с дезактивирано пълно групиране) резултат 18 реда.
Моите съмнения са:
- Защо наборът от резултати варира, групата по всъщност не трябва да променя резултата в моя случай.
- Някаква работа, за да се постигне същото, без да се налага да деактивирате FULL GROUP BY?
Четох за MySQL ANY_VALUE, но отново не работи с SELECT ANY_VALUE(*)
Имате нужда от помощ как да постигнете горното :) Благодаря
Актуализация 1
Локална машина:
SQL версия 5.7.24
SQL режим:
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Въпросна заявка:
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 реда
DB Fiddle
https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=6082783b8a2c58ab584f>
SQL версия 5.7.26
SQL РЕЖИМ
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Резултат от заявката:
17 реда
SET sql_mode = '';
-- получавам 17 реда. Междувременно, какво получавате с предложението на Гордън? - person Rick James   schedule 28.06.2019sql_mode=''
илиSELECT h.*
илиSELECT ANY_VALUE(h.id), ...
, можете да направитеSELECT MIN(h.id), ...
. - person Rick James   schedule 28.06.2019SELECT * FROM (...)
може да бъде премахнат. - person Rick James   schedule 28.06.2019