Функция SQL похожа на xmlagg или listagg - PullRequest
0 голосов
/ 05 марта 2019

Я новичок в SQl, и я написал запрос для извлечения отчетов о событиях из базы данных событий, где данные каждого события хранятся в разных таблицах на основе информации о слоте события.
Ниже приведены таблицы:

EVENT_D

ID     HOST       MESSAGE 
---------- ----------------- 
ID1    server1    Server Down
ID2    server2    File System Issue

EVENT_INFO

ID    RECEIVED_TIME          
---------- -------------
ID1   03-05-2019 12:09PM
ID2   03-06-2019 03:00AM

EVENT_OPERATIONS

ID     EG_TIME               EG_OPERATION 
---------- ------------------------------- 
ID1    03-05-2019 12:10 PM    Blacked Out
ID1    03-05-2019 12:10 PM    Reopened
ID1    03-05-2019 12:13 PM    Ownership Taken
ID1    03-05-2019 12:50 PM    Closed
ID2    03-06-2019 03:05 AM    Rule applied
ID2    03-06-2019 03:06 AM    Ownership Taken
ID2    03-06-2019 03:07 AM    Ticket triggered
ID2    03-06-2019 03:30 AM    Closed

Ожидаемый результат:

ID     HOST       MESSAGE               RECEIVED_TIME           Operations
---------- ------------------------------------------------------------------------------------------------------------------------------------- 
ID1    server1    Server Down           03-05-2019 12:09PM      Blacked Out 03-05-2019 12:10 PM; Reopened 03-05-2019 12:10 PM; Ownership Taken 03-05-2019 12:13 PM; Closed 03-05-2019 12:50 PM
ID2    server2    File System Issue     03-06-2019 03:00AM      Rule applied 03-06-2019 03:05 AM; Ownership Taken 03-06-2019 03:06 AM; Ticket triggered 03-06-2019 03:07 AM; Closed 03-06-2019 03:30 AM

Используемый запрос:

  SELECT a.ID          AS Event_ID,
         a.HOST        AS Hostname,
         a.MESSAGE     AS EventMessage,
         b.RECEIVED_TIME AS EventReception,
         LISTAGG (
             c.EG_OPERATION || TO_CHAR (c.EG_TIME, 'YYYY-MM-DD hh12:mi:ss AM'),
             ';')
         WITHIN GROUP (ORDER BY c.EG_TIME) as Operations
    FROM EVENT_D a
         INNER JOIN EVENT_INFO b ON b.ID = a.ID
         INNER JOIN EVENT_OPERATIONS c ON c.ID = a.ID
   WHERE     b.RECEIVED_TIME >= TO_DATE ('2019-03-01', 'YYYY-MM-DD hh24:mi:ss')
         AND b.RECEIVED_TIME < TO_DATE ('2019-03-04', 'YYYY-MM-DD hh24:mi:ss')
GROUP BY a.ID,
         a.HOST,
         a.MESSAGE,
         b.RECEIVED_TIME

Проблема:

Если запрос выполняется без функции listagg / xmlagg и выражения groupby , количество записей в выводе будет около 6000 в день (вреальный сценарий).Но из-за использования выражения groupby в приведенном выше запросе в счетчике событий имеется несоответствие.События группируются по хосту, сообщению и другим слотам, что, в свою очередь, влияет на количество.Вместо 6000 записей мы получаем около 600> записей в реальном сценарии.

Вопрос: Есть ли какая-либо другая функция, кроме listagg / xmlagg, которая может предоставить нам вывод вожидаемый формат.

1 Ответ

0 голосов
/ 05 марта 2019

Возможно, вы хотите LISTAGG() в качестве оконной функции:

SELECT . . .,
       LISTAGG (c.EG_OPERATION || TO_CHAR (c.EG_TIME, 'YYYY-MM-DD hh12:mi:ss AM'),
                ';'
               ) WITHIN GROUP (ORDER BY c.EG_TIME) OVER (PARTITION BY ID, HOST) as Operations

Затем вы удалите GROUP BY.

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