Извлечь максимальные значения даты для 4 различных предметов из списка тысяч - PullRequest
0 голосов
/ 05 октября 2018

У меня есть запрос следующим образом

SELECT *
  FROM [VNPoller].[DBA].[uccpu1mUTMStats]
    WHERE resid in (SELECT resid
            FROM [VNPoller].[DBA].[ResourceView]
            WHERE Dataset in 
                (SELECT dataset     
                FROM [VNPoller].[DBA].[DatasetTable]
                WHERE datasetDescription LIKE '%CPU%'
                 )
             AND devID = '1157') 
    order by dttm desc

У меня есть список устройств, которые опрашиваются каждые 5 минут, каждый опрос добавляет новую строку в таблицу с последними значениями, Im в этом случае я ищуна процессоре.Однако устройство может иметь несколько процессоров, поэтому у меня может быть 4 значения для процессора за последние 5 минут, поэтому 4 новые записи в БД.Каждый процессор имеет уникальный идентификатор.Мне нужно увидеть Max (последнее значение dttm для каждого из 4-х мест проживания. Мой запрос возвращает все строки за весь день. Или я могу получить, чтобы отобразить только одно значение, используя max (dttm), но мне нужны другие 3значения. Может быть, картина может помочь объяснить. Большое спасибо всем, кто может предложить некоторую помощь здесь

screeshot

Мне интересны только 4 верхних элемента (максимум (dttm) длякаждый из различных резидентов. Остальные дублируются, но для ранних отметок времени

Пример данных из таблицы uccpu1mUTMStats, которая фактически содержит тысячи строк:

dttm                    resID   cpmCPUTotalMonIntervalValue
2018-09-28 22:10:00.000 294324  0
2018-09-28 22:10:00.000 294325  0
2018-09-28 22:10:00.000 294432  1
2018-09-28 22:10:00.000 294482  0
2018-09-28 22:10:01.000 294415  0
2018-09-28 22:10:01.000 294433  1
2018-09-28 22:10:01.000 294669  0
2018-09-28 22:10:02.000 294396  0
2018-09-28 22:10:02.000 294397  0
2018-09-28 22:10:02.000 294416  0
2018-09-28 22:10:03.000 294417  0
2018-09-28 22:10:03.000 294434  1
2018-09-28 22:10:03.000 294435  1
2018-09-28 22:10:04.000 294398  0
2018-09-28 22:10:04.000 294399  0
2018-09-28 22:10:04.000 294418  0
2018-09-28 22:10:05.000 294400  0
2018-09-28 22:10:05.000 294419  0

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

dttm                    resID   cpmCPUTotalMonIntervalValue
2018-10-05 15:21:37.000 294100  21
2018-10-05 15:21:24.000 294099  23
2018-10-05 15:20:53.000 294098  19
2018-10-05 15:20:16.000 294097  23

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Используется функция RANK() для разделения результатов на resID, ранжированные по времени.TOP 1 WITH TIES ограничивает набор результатов только самыми последними значениями.

SELECT TOP 1 WITH TIES
  *
  FROM [VNPoller].[DBA].[uccpu1mUTMStats]
    WHERE resid in (SELECT resid
            FROM [VNPoller].[DBA].[ResourceView]
            WHERE Dataset in 
                (SELECT dataset     
                FROM [VNPoller].[DBA].[DatasetTable]
                WHERE datasetDescription LIKE '%CPU%'
                 )
             AND devID = '1157') 
    ORDER BY RANK() OVER (PARTITION BY resID ORDER BY dttm DESC)
0 голосов
/ 05 октября 2018

разбит на два запроса, его легче читать:

запрос максимального идентификатора:

SELECT resid, MAX(dttm)
FROM [VNPoller].[DBA].[uccpu1mUTMstats] s
GROUP BY s.resid

, и теперь вы можете присоединить этот запрос к другому

SELECT *
FROM [VNPoller].[DBA].[uccpu1mUTMStats] AS r
JOIN (SELECT resid AS resid, MAX(dttm) as dttm
         FROM [VNPoller].[DBA].[uccpu1mUTMstats] s
         GROUP BY s.resid) AS sq ON sq.dttm = r.dttm
WHERE r.resid in (SELECT resid
        FROM [VNPoller].[DBA].[ResourceView]
        WHERE Dataset in 
            (SELECT dataset     
            FROM [VNPoller].[DBA].[DatasetTable]
            WHERE datasetDescription LIKE '%CPU%'
             )
         AND devID = '1157') 
...