SQL: сравнение целого ряда данных с числом - PullRequest
1 голос
/ 13 сентября 2010

Я в основном записываю данные в базу данных SQL каждую минуту, но я хочу иметь возможность проверить, не пропущены ли какие-либо записи (т. Е. Посмотреть, есть ли различия больше минуты).

Возьмем для примера:

5 4 2 1

Я бы хотел отобразить строки, в которых существуют 4 и 2, чтобы я знал, что между ними что-то не хватает.Фактические данные представлены в следующем формате.

date_time

2010-09-12 10: 45: 00

2010-09-12 10: 44: 00

и т.д ..

Я обнаружил, как извлечь минутное значение, используя EXTRACT (MINUTE FROM date_time), однако я совершенно растерялся относительно того, как сделать сравнение по всей таблице.

Любая помощь будет потрясающей.

Спасибо

1 Ответ

1 голос
/ 13 сентября 2010

MySQL не имеет рекурсивной функциональности, поэтому вам остается использовать табличный трюк NUMBERS -

  1. Создать таблицу, содержащую только увеличивающиеся числа - это легко сделать с помощью auto_increment:

    DROP TABLE IF EXISTS `example`.`numbers`;
    CREATE TABLE  `example`.`numbers` (
      `id` int(10) unsigned NOT NULL auto_increment,
       PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
  2. Заполните таблицу, используя:

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ... столько раз, сколько вам нужно.

  3. Используйте DATE_ADD для построения списка дат, увеличивая дни на основе значения NUMBERS.id.Замените «2010-06-06» и «2010-06-14» на соответствующие даты начала и окончания (но используйте один и тот же формат «ГГГГ-ММ-ДД ЧЧ: ММ: СС») -

    SELECT x.*
      FROM (SELECT DATE_ADD('2010-06-06', INTERVAL n.id - 1 MINUTE)
              FROM numbers n
             WHERE DATE_ADD('2010-06-06', INTERVAL n.id -1 MINUTE) <= '2010-06-14' ) x
    
  4. СЛЕВА ПРИСОЕДИНЯЙТЕСЬ к своей таблице данных на основе временной доли:

       SELECT x.ts AS timestamp,
              COALESCE(yt.col, 'missing') AS cnt
         FROM (SELECT DATE_FORMAT(DATE_ADD('2010-06-06', INTERVAL n.id - 1 MINUTE), '%Y-%m-%d %k:%i') AS ts
                 FROM numbers n
                WHERE DATE_ADD('2010-06-06', INTERVAL n.id - 1 MINUTE) <= '2010-06-14') x
    LEFT JOIN YOUR_TABLE yt ON DATE_FORMAT(yt.date, '%Y-%m-%d %k:%i') = x.ts
    

См. Документацию для получения дополнительной информации о функции DATE_FORMAT.

...