Получить записи за последние 24 часа, имеющие совпадающие данные и максимальное значение - PullRequest
0 голосов
/ 01 мая 2018

У меня есть таблица с нижеприведенной информацией.

    CREATE TABLE  notifications (
    `notification_id` int(11) NOT NULL AUTO_INCREMENT,
    `source` varchar(50) NOT NULL,
    `created_time` datetime NOT NULL,
    `not_type` varchar(50) NOT NULL,
    `not_content` longtext NOT NULL,
    `notifier_version` varchar(45) DEFAULT NULL,
    `notification_reason` varchar(245) DEFAULT NULL,
    PRIMARY KEY (`notification_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8;

    INSERT INTO `notifications` (`notification_id`,`source`,`created_time`,`not_type`,`not_content`,`notifier_version`,`notification_reason`) VALUES 
    (50,'Asia','2018-05-01 18:10:12','Alert','You are alerted for some Reason','NO_03','Some Reason 1'),
    (51,'Asia','2018-04-29 14:10:12','Alert','You are alerted for some Reason','NO_02','Some Reason 8'),
    (52,'Europe','2018-04-29 10:10:12','Warning','You are Warned for som Reason','NO_02',NULL),
    (53,'Europe','2018-05-01 10:10:12','Warning','You are Warned for som Reason','NO_02',NULL),
    (54,'Europe','2018-04-30 23:10:12','Alert','You are alerted for some Reason','NO_03','Some Reason 1');

Мне нужен список источников с последним полученным предупреждением, количеством предупреждений, полученных за последние 24 часа, и уведомленной версией, отправившей последнее предупреждение.

Столбцы, которые мне нужны в моем результате,

  1. source- Отдельные экземпляры в таблице
  2. messages_reason - Последнее поднятое уведомление, событие, если оно было раньше 24 часов для источника
  3. notifier_version - версия Notfier, которая вызвала последнее предупреждение для источника
  4. alert_count - Количество предупреждений за последние 24 часа для источника.

Я пробовал что-то, как в этой скрипте SQL Может кто-нибудь исправить меня и дать решение

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Вы можете использовать идею производной таблицы, чтобы получить самый последний идентификатор и счет за последние 24 часа.

SELECT
  COUNT(`notification_id`) AS AlertCount,
  MAX(`notification_id`) AS MaxNotification
FROM
  `notifications`
WHERE
  `created_time` BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR) AND NOW()
  AND `not_type` = 'Alert';

Затем присоединитесь и отфильтруйте:

SELECT
  NotificationTbl.source,
  NotificationTbl.notification_reason,
  NotificationTbl.notifier_version,
  Last24HoursTbl.alert_count
FROM
  `notifications` AS NotificationTbl
INNER JOIN
  (
   SELECT
      COUNT(`notification_id`) AS alert_count,
      MAX(`notification_id`) AS max_notification_id
    FROM
      `notifications`
    WHERE
      `created_time` BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR) AND NOW() 
      AND `not_type` = 'Alert'
  ) AS Last24HoursTbl
  ON NotificationTbl.notification_id = Last24HoursTbl.max_notification_id
  ;

Результаты (на момент ответа):

source |    notification_reason | notifier_version | alert_count
------------------------------------------------------------
Europe |    Some Reason 1       | NO_03            | 1

SQLFiddle: http://sqlfiddle.com/#!9/14bb6a/14

0 голосов
/ 01 мая 2018

Я думаю, что это то, что вы хотите:

select n.source,
       max(case when na.max_ni = n.notification_id then notification_reason end) as last_alert_reason,
       sum(n.not_type = 'Alert') as alert_count,
       max(case when na.max_ni = n.notification_id then notifier_version end) as last_alert_version 
from notifications n left join
     (select n2.source, max(notification_id) as max_ni
      from notifications n2
      where n2.not_type = 'Alert'
      group by n2.source
     ) na
     on n.source = na.source
group by n.source;

Скрипка SQL здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...