Обнаружение пропусков - определить, какая дата была пропущена / пропущена - PullRequest
0 голосов
/ 05 июля 2019

У меня есть таблица базы данных, в которой есть записи с ID и date - диапазонами дат.

Для некоторых идентификаторов изначально были импортированы даты в дата до столбца.Меня интересовали только месяцев , дата вроде 2018-06-01 00:00:00 представляет весь июньский месяц 2018. (Меня не интересуют дни и время, 01 день был установлен, потому что янельзя использовать 00).

2019- 01 -01 (дата с) и 2019- 01 -01 (дата до) представляет месяц (январь).

2018- 09 -01 (дата от) и 2018- 11 -01 (дата до) представляет интервалмесяцев (01 сентября - 31 ноября)

enter image description here

Итак, я хочу получить идентификаторы, где есть пропуски, пропущенный месяцили месячные интервалы.Как я могу решить это с помощью sql?С чего начать?

Ответы [ 2 ]

1 голос
/ 05 июля 2019

В MySQL 5.x вы можете использовать коррелированный запрос (очень медленный) для выявления пробелов.Примерный план запроса:

SELECT *
FROM (
    SELECT id, start_date, start_date - INTERVAL 1 MONTH AS prev_end_date_exp, (
        SELECT end_date
        FROM yourdata AS x
        WHERE id = t.id AND end_date < t.start_date
        ORDER BY end_date DESC
        LIMIT 1
    ) AS prev_end_date_act
    FROM yourdata AS t
) AS sq
WHERE prev_end_date_exp <> prev_end_date_act

Это даст вам список строк, которые содержат пробел между собой и предыдущей строкой и диапазон (не список) дат.

1 голос
/ 05 июля 2019

Если вы не используете 8.0, вы можете создать рабочую таблицу для хранения данных:

 CREATE TABLE _gap_cal (
      ID int not null,
      date_to date not null,
      rid int not null auto_increment,
      date_from date null,
      PRIMARY KEY (ID,rid)
 ) ENGINE=MYISAM;

Затем заполните данные следующим образом:

INSERT _gap_cal(ID,date_from,date_to,rid)
SELECT ID,COALESCE(date_from,'1900-01-01'),date_to,NULL
FROM your_data_table
ORDER BY ID,date_to;

Для целей тестирования:Я просто вставляю некоторые данные напрямую:

INSERT _gap_cal(ID,date_from,date_to,rid)
VALUES (6545,'1900-01-01','2018-06-01',NULL),
  (6545,'2018-09-01','2018-11-01',NULL),
  (6545,'2019-01-01','2019-01-01',NULL),
  (2421,'2019-04-01','2019-06-01',NULL),
  (2421,'2019-07-01','2019-07-01',NULL),
  (2421,'2019-09-01','2019-11-01',NULL);

SELECT * FROM _gap_cal;

Следующий запрос даст вам идентификаторы и диапазоны дат с пробелами:

SELECT c.ID,c.date_from,c.date_to, p.date_from as previous_date_from
FROM _gap_cal p
INNER JOIN _gap_cal c
ON p.ID=c.ID
AND p.rid=c.rid-1
AND TIMESTAMPADD(MONTH,1, p.date_to)<>c.date_from
ORDER BY c.ID,c.date_from;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...