Создать текстовый файл на основе сравнения двух строк в MYSQL - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть таблица MYSQL, которая содержит timestamp и direction (сигнал покупки / продажи) данных фондового рынка.

Ниже приведен пример выборки данных CREATE и INSERT .

Таблица в порядке убывания timestamp, и таблица усекается и вставляется с 5-минутным интервалом. Я включил поле id, которое автоинкрементно, поскольку оно может помочь при сравнении первой строки со второй строкой.

Каждый раз, когда меняется направление рынка, я хочу, чтобы был создан текстовый файл. В качестве примера (из данных примера), когда timestamp было 15:00:00, поскольку это была первая строка, которая была вставлена ​​в таблицу, он должен сгенерировать текстовый файл как SELL.txt. В 15:05:00, поскольку direction изменился с SELL на BUY, он должен сгенерировать текстовый файл как BUY.txt. Поскольку direction не изменился в 15:10:00 и 15:15:00 по сравнению с предыдущей строкой, текстовый файл генерировать не следует. В 15:20:00, так как direction изменился с BUY на SELL, он должен сгенерировать текстовый файл как SELL.txt. Так как direction не изменился в 15:25:00 и 15:30:00 по сравнению с предыдущей строкой, текстовый файл генерировать не следует.

В итоге, если значение ячейки первой строки поля direction не равно значению ячейки второй строки поля direction, то текстовый файл должен быть сгенерирован на основе значения первой строки поля direction. Если значение ячейки первой строки поля direction равно значению ячейки второй строки поля direction, текстовый файл генерировать не нужно.

Я предполагаю, что это может быть реализовано с использованием хранимых процедур. Тем не менее, я новичок в хранимых процедурах, и я не смог реализовать это до сих пор. Я был бы очень признателен, если кто-то может помочь в этом отношении.

спасибо и всего наилучшего,

CREATE TABLE `tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `timestamp` datetime DEFAULT NULL,
  `direction` varchar(10) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO `market`.`tbl`
(`id`,
`timestamp`,
`direction`)
VALUES
(1,'2020-02-24 15:30:00','BUY'),
(2,'2020-02-24 15:25:00','SELL'),
(3,'2020-02-24 15:20:00','SELL'),
(4,'2020-02-24 15:15:00','BUY'),
(5,'2020-02-24 15:10:00','BUY'),
(6,'2020-02-24 15:05:00','BUY'),
(7,'2020-02-24 15:00:00','SELL');

1 Ответ

0 голосов
/ 25 февраля 2020
CREATE TRIGGER tr
AFTER INSERT
ON tbl
FOR EACH ROW
BEGIN
IF EXISTS ( SELECT 1
            FROM tbl t1, tbl t2
            WHERE t1.`timestamp` BETWEEN CURRENT_TIMESTAMP - INTERVAL 2 MINUTE
                                     AND CURRENT_TIMESTAMP + INTERVAL 2 MINUTE
              AND t2.`timestamp` BETWEEN CURRENT_TIMESTAMP - INTERVAL 7 MINUTE
                                     AND CURRENT_TIMESTAMP - INTERVAL 3 MINUTE
              AND t1.direction != t2.direction ) THEN
    IF 'SELL' = ( SELECT direction
                  FROM tbl
                  ORDER BY `timestamp` DESC LIMIT 1 ) THEN
        /* SELECT 1 INTO OUTFILE 'SELL.txt'; */
        INSERT INTO service (txt) VALUES (CONCAT(CURRENT_TIMESTAMP, ' SELL'));
    ELSE
        /* SELECT 1 INTO OUTFILE 'BUY.txt'; */ 
        INSERT INTO service (txt) VALUES (CONCAT(CURRENT_TIMESTAMP, ' BUY'));
    END IF;
END IF;
END

fiddle

Выполнение скрипки много раз - вы увидите, что сообщения генерируются, когда направления в 2 последних записях различаются, и не генерируются, когда Направления одинаковы.

Проблема - каждая вставка (кроме первой) генерирует вставку в служебную таблицу (и создание OUTFILE, если раскомментирует ее) - но вторая попытка создать OUTFILE (которая уже существует) потерпит неудачу, что приведет к сбою всего запроса вставки. Вы должны создать некоторую отметку stati c (служебная таблица, в которой хранится временная метка, безопасна - и проверять ее с некоторым разрешением, как при проверке записей, +/- 2 мин. Кажется полезной), которая позволяет определить, что файл уже был созданный во время этой ВСТАВКИ, и не пытайтесь создать его еще раз.

...