Нужно получать курс первого дня, для выбранного периода - first, и последнего дня - last. Чтобы высчитать разницу. После чего {last} - {first} = {Х}. И вот по этому {Х} делать сортировку выборки.
SELECT DISTINCT
coin_uuid,
FIRST_VALUE(price) OVER (PARTITION BY coin_uuid ORDER BY last_updated ASC) firstprice,
FIRST_VALUE(price) OVER (PARTITION BY coin_uuid ORDER BY last_updated DESC) lastprice
FROM exchange_rates
ORDER BY coin_uuid, lastprice - firstprice
Очень мешает откуда-то самопроизвольно возникающая схема mydb, которую я не могу удалить.
таблицы стали создаваться именно в ней, а не в той схеме с которой я работаю
CREATE TABLE dbname.tablename ( .. );
) - таблица будет создана именно в указанной БД. Если же имя БД не указать - таблица создаётся в текущей БД. Почему у Вас именно эта БД текущая, и почему Вы не меняете её перед созданием таблиц запросом USE - это именно к Вам вопросы, и именно Ваша вина в том, что таблицы создаются "не там". что эффективнее: хранить в записи список id объектов, которые должны быть обработаны при обращении к этой записи, в виде строки (скрипт будет парсить строку и отрабатывать каждый id), либо сделать триггер и хранимую процедуру (MySQL), которая возьмёт эту работу на себя?
SELECT prices.*
FROM prices
JOIN ( SELECT size, MAX(`date`) AS `date`
FROM prices
WHERE price
-- AND `date` <= @some_date
GROUP BY size ) AS last_nonzero_date USING (size, `date`);
(size, `date`)
- уникально.Есть папка, которая хранит в себе sql файлы для создания бд, таблиц в этой бд, импорт данных в эти таблицы.
Как автоматизировать запуск этих sql скриптов?
нужно удалить записи с одинаковыми date и user_id
DELETE t1.*
FROM tablename t1
JOIN tablename t2 USING (date, user_id)
WHERE t1.id > t2.id
а лучше не создавать их
CREATE UNIQUE INDEX indexname ON tablename (date, user_id)
SELECT `p`.`sum`, `p`.`type`, `p`.`visit`
FROM `visits` AS `v`
JOIN `payments` AS `p` ON `v`.`id` = `p`.`visit`
WHERE DATE(p.date) = '2021-10-04' AND `v`.`office` = '1'
SELECT `p`.`sum`, `p`.`type`, `p`.`visit`
FROM `visits` AS `v`
JOIN `payments` AS `p` ON `v`.`id` = `p`.`visit`
WHERE p.date >= '2021-10-04'
AND p.date < '2021-10-05'
AND `v`.`office` = '1'
visits (office, id)
.payments (`date`, visit)
и payments (visit, `date`)
, посмотреть какой из них используется, удалить неиспользуемый.AND `v`.`office` = 1
. В исходном виде, если поле числовое, то и поле, и значение приводятся к floating-point number, и только потом сравниваются. SELECT p.*, GROUP_CONCAT(c.name) countries
FROM p
JOIN с ON FIND_IN_SET(c.id, p.country)
GROUP BY p.id
Например, пишу я такой SELECT и все нормально
SELECT Trip.plane, Trip.id
Но при таком мне выдает ошибку
SELECT Trip.plane, COUNT(Trip.plane) planes
Откуда это берется вообще? /*!40001 SQL_NO_CACHE */ и как это убрать?
/*!
) - код из комментария обрабатывается любой версией.В голове идея создать varchar ячейку и в неё через запятую всё записывать.
CREATE TABLE words (
word_id INT AUTO_INCREMENT PRIMARY KEY,
word VARCHAR(255) UNIQUE NOT NULL
);
CREATE TABLE phrase (
phrase_id INT NOT NULL,
FOREIGN KEY (phrase_id) REFERENCES phrases (phrase_id),
word_id INT NOT NULL,
FOREIGN KEY (word_id) REFERENCES words (word_id),
word_position INT,
PRIMARY KEY (phrase_id, word_position)
);
INSERT ... VALUES ( ... , CAST(REPLACE(@value, ',', '.') AS DOUBLE), ...
CREATE PROCEDURE delete_rows()
BEGIN
SELECT @@autocommit INTO @autocommit;
SET SESSION autocommit = ON;
REPEAT
DELETE FROM bigtable WHERE state=2 LIMIT 10000;
SELECT SLEEP(1) INTO @tmp;
UNTIL NOT ROW_COUNT() END REPEAT;
SET SESSION autocommit = @autocommit;
END
SELECT UserID, t1.CountMessage-t2.CountMessage
FROM daily_exp_snapshots t1
JOIN daily_exp_snapshots t2 USING (UserID)
WHERE t1.date_added >= CURRENT_DATE
AND t1.date_added < CURRENT_DATE + INTERVAL 1 DAY
AND t2.date_added >= CURRENT_DATE - INTERVAL 1 DAY
AND t2.date_added < CURRENT_DATE