powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Исключить из выдачи данные полученные на 10 мин раньше и на 10 минут позже
7 сообщений из 7, страница 1 из 1
Исключить из выдачи данные полученные на 10 мин раньше и на 10 минут позже
    #40088183
konica1970
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет, нужна помощь. Есть таблица в которой даны id и время присвоения id, сами id могут повторятся. Нужно вывести все id, кроме дубликатов которые отстоят от него +10 мин и - 10 минут их выводить не нужно. Такая вот задача, заранее спасибо
(для модераторов : ранее вопрос не в ту ветку запостил, сорри)
...
Рейтинг: 0 / 0
Исключить из выдачи данные полученные на 10 мин раньше и на 10 минут позже
    #40088239
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выложите пример данных в виде CREATE TABLE + INSERT INTO и требуемый ответ для этих данных. Не забудьте указать точную версию MySQL.

konica1970
Нужно вывести все id, кроме дубликатов которые отстоят от него +10 мин и - 10 минут их выводить не нужно.

Допустим, есть три записи, в Т+0, Т+7 и Т+15 минут. Что выводить? Т+0? Т+7? Т+0 и Т+15? почему?
...
Рейтинг: 0 / 0
Исключить из выдачи данные полученные на 10 мин раньше и на 10 минут позже
    #40088262
konica1970
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

привет версия MySQL, 8.0.21.
авторДопустим, есть три записи, в Т+0, Т+7 и Т+15 минут. Что выводить? Т+0? Т+7? Т+0 и Т+15? почему?
Выводим т+0 и T+15 потому что T+0 это первое встреченное значение, T+7 не нужно выводить оно в пределах 10 минут, Т+15 отстоит от первого выведенного Т+0 более чем на 10 минут выводим его , естественно id для этих времен одинаковое
...
Рейтинг: 0 / 0
Исключить из выдачи данные полученные на 10 мин раньше и на 10 минут позже
    #40088347
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
deleted
...
Рейтинг: 0 / 0
Исключить из выдачи данные полученные на 10 мин раньше и на 10 минут позже
    #40088355
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, оконные функции не помощник - задача итеративная.

Но легко решается на переменных. Например, так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT id, dt
FROM ( SELECT test.*,
              CASE WHEN id <> @prev_id OR dt > @prev_dt + 10
                   THEN 1
                   ELSE 0 END next_grp,
              CASE WHEN id <> @prev_id OR dt > @prev_dt + 10
                   THEN @prev_dt := dt END vdt,
              @prev_id := id vid
       FROM test
       CROSS JOIN ( SELECT @prev_id := MIN(id) - 1, 
                           @prev_dt := MIN(dt) - 11
                    FROM test ) init_vars
       ORDER BY test.id, test.dt ) subquery
WHERE next_grp;


https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=f5c114b16bf00f641e4104de62f2e93e
...
Рейтинг: 0 / 0
Исключить из выдачи данные полученные на 10 мин раньше и на 10 минут позже
    #40090024
konica1970
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, большое спасибо :))
...
Рейтинг: 0 / 0
Исключить из выдачи данные полученные на 10 мин раньше и на 10 минут позже
    #40091054
andrey odegov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или рекурсивная, что может сказаться на производительности:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
WITH RECURSIVE
  a AS (
    SELECT id, dt,
      ROW_NUMBER() OVER(
        PARTITION BY id
        ORDER BY dt
      ) AS rn
    FROM test
  ),
  r AS (
    SELECT
      id, dt, rn, dt AS cur_dt, 1 AS inc
    FROM a
    WHERE rn = 1
    UNION ALL
    SELECT
      a.id, a.dt, a.rn, if(c.gt10, a.dt, r.cur_dt), if(c.gt10, 1, 0)
    FROM a JOIN r ON a.id = r.id AND a.rn = r.rn + 1,
    LATERAL (SELECT a.dt - r.cur_dt > 10 AS gt10) AS c
  )
SELECT id, dt
FROM r
WHERE inc = 1
ORDER BY id, dt;
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Исключить из выдачи данные полученные на 10 мин раньше и на 10 минут позже
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]