Arhn - архитектура программирования

MySQL удаляет все строки, добавляемые каждую минуту, но оставляет только 1

У меня есть таблица MySQL с именем datas и такой столбец:

id int(11)
currency varchar(16)
date_time (datetime)

Пример данных:

id         currency      date_time
---------  ------------  ---------------------
12         EURUSD        2019-01-28 11:19:26
13         EURUSD        2019-01-28 11:19:29
14         EURUSD        2019-01-28 11:19:34
15         EURUSD        2019-01-28 11:19:38
16         EURUSD        2019-01-28 11:19:49
17         GBPUSD        2019-01-28 11:19:23
18         GBPUSD        2019-01-28 11:19:27
19         GBPUSD        2019-01-28 11:19:39
20         GBPUSD        2019-01-28 11:19:45
21         GBPUSD        2019-01-28 11:19:57

Должно быть так (удалите другую за одну минуту только по одной строке в каждой валюте):

12         EURUSD        2019-01-28 11:19:26
17         GBPUSD        2019-01-28 11:19:23

И моя программа вставляет строки примерно каждые 3-6 секунд. но я хочу сохранить цену только в одной валюте за 1 минуту, а остальные хочу удалить.

Как я могу сделать это с помощью запроса MySQL? Я использую PHP.

Мои задания cron будут работать каждые 15 минут. с php будет работать этот запрос.

Версия MySQL = 5.7.25

28.01.2019

  • какая у тебя версия mysql 28.01.2019
  • @ fa06 mysql версии 5.7.25 28.01.2019
  • datas звучит как плохое название таблицы 28.01.2019
  • Что ты уже сделал? 28.01.2019
  • Рассматривали ли вы вставку для каждой валюты, используя левое соединение для валюты и гггг-мм-дд ЧЧ: мм, где нет совпадений? Тогда у вас будет только одна запись на валюту в минуту. 28.01.2019
  • Или, удалив существующие записи валюты перед вставкой 28.01.2019
  • @peter эта программа выполняет только быструю вставку 28.01.2019

Ответы:


1

Вы можете использовать это:

DELETE FROM t
WHERE (currency, date_time) NOT IN (
    SELECT * FROM (
        SELECT currency, MIN(date_time)
        FROM t
        GROUP BY currency, UNIX_TIMESTAMP(date_time) - UNIX_TIMESTAMP(date_time) % (1 * 60)
    ) AS x
)

Выражение UNIX_TIMESTAMP(datetime) - UNIX_TIMESTAMP(datetime) % (n * 60) ограничит значение datetime границей n * 60 секунд , как описано здесь. Вы можете сгруппировать по этому выражению, чтобы найти currency, MIN(datetime) пар в каждой группе.

28.01.2019
  • спасибо человек работает! Также, если я хочу использовать удаление каждые 5 минут? как я могу использовать и вы можете добавить это? 28.01.2019
  • Итак, вы хотите сохранить 1-й ряд для каждых подходов 0-5, 5-10, 10-15 минут? 28.01.2019
  • Ваше datetime содержит миллисекунды? 28.01.2019
  • как это 2019-01-28 11:19:26 стандартное время 28.01.2019
  • Не тестировал, но GROUP BY currency, UNIX_TIMESTAMP(date_time) - UNIX_TIMESTAMP(date_time) % (5 * 60) может работать / 28.01.2019
  • ты я проверю чувака 28.01.2019

  • 2

    Вы можете использовать НЕ В минимальном идентификаторе (или максимальном, если хотите) группу по минутам и валюте

    delete from my_table  
    where id NOT IN  (
        select  my_id 
        from (
        select  min(id) my_id
        from  my_table 
        GROUP BY currency
            , YEAR(date_time)
            , month(date_time)
            , day(date_time)
            , HOUR(date_time)
            , MINUTE(date_time)
        ) T
    ) 
    
    28.01.2019
  • возвращается; # 1093 - Вы не можете указать целевую таблицу my_table для обновления в предложении FROM 28.01.2019
  • ответ обновлен .. использование подзапроса для принудительного применения временной таблицы 28.01.2019
  • я тестировал не удалять во всех валютах. 28.01.2019
  • 9351 2019-01-28 11:46:36 6.0173 GBPUSD 9353 2019-01-28 11:46:38 6.0173 GBPUSD 28.01.2019
  • ваш запрос работает и удаляет много строк, но у некоторых валют есть несколько строк в каждую минуту, которые я добавил ранее в живом выводе db 28.01.2019
  • объясните лучше свой последний комментарий .. я не понимаю .. запрос должен удалять всю строку -1 для каждой минуты .. min_id должен быть уникальным 28.01.2019
  • 9351 2019-01-28 11:46:36 6.0173 GBPUSD 9353 2019-01-28 11:46:38 6.0173 GBPUSD это 2 строки после того, как я запустил ваш запрос. и должен быть удален один. но все еще там 28.01.2019
  • @SwiftDeveloper ... для теста попробуйте выполнить внутренний подзапрос, проверьте количество строк, перенастроенных для GBPUSD от 28.01.2019 11:46:36 ... и дайте мне знать ... также убедитесь, что результат вашего запроса обновлен правильно. . 28.01.2019
  • min(id) может не совпадать с первой меткой времени для этой группы! 28.01.2019

  • 3

    Вы можете попробовать ниже -

    delete  b from datas b join
    (
    SELECT 
        @row_number:=CASE
            WHEN @currency = currency THEN @row_number + 1
            ELSE 1
        END AS num,id
        @currency:=currency as currency,date_time
    FROM
        datas,(SELECT @currency:=0,@row_number:=0) as t
    ORDER BY currency
    )A on a.id=b.id where num<>1
    
    28.01.2019
  • дает это # ​​1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '(SELECT @row_number: = CASE WHEN @ 28.01.2019
  • попробую еще раз, чувак 28.01.2019
  • # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис рядом с 'b join 28.01.2019
  • # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '@currency: = currency as currency, date_time 28.01.2019
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..