DB2 MAX с дополнительными столбцами - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть таблица DB2, в которой есть следующие столбцы, которые мне нужно вернуть в запросе

ENTITY             START_TIME          END_TIME           NUMBER        BYTES
SERVER1SQL    2020-03-29 23:03:04   2020-03-30 01:52:37   761102     72212891243
SERVER1       2020-03-31 00:00:30   2020-03-31 01:33:40   765443      4532123432
SERVER2       2020-03-31 01:00:10   2020-03-31 01:40:12   765831     19531321013
SERVER19      2020-03-31 00:20:30   2020-03-31 02:10:40   765955      5212347991
SERVER7       2020-03-31 02:00:29   2020-03-31 02:33:10   766121      2321956753
SERVER1SQL    2020-03-30 23:00:50   2020-03-31 03:40:18   764892     72212891243
SERVER11      2020-03-31 03:06:02   2020-03-31 04:05:40   766337       688174321

Мне нужно найти запись для каждой сущности с максимумом (байтами), но мне нужно вернуть все колонны. Моя проблема в том, что у меня есть объекты БД, которые будут день за днем ​​выполнять резервное копирование одного и того же количества, и если я захочу go вернуться на 30 дней и найти максимальное количество байтов, которое указывает, что объект c возвращает несколько записей. Похоже, что запрос работает только тогда, когда я включаю только ENTITY и MAX (БАЙТЫ) без даты и номера (т. Е. SESSION ID). Итак, как мне получить максимальные результаты без дубликатов. Если есть дубликат, я хочу самую последнюю запись. Вот что у меня в настоящее время в основном работает, за исключением сущностей БД, которые возвращают дубликаты. Я искал по всему, и этот вид запроса кажется проблематичным c.

select
 varchar(max_sum.entity,45) as entity,
 translate('abcde fg:hi:jk', a.start_time, '_____abcde_fg_hi_jk_____',' ') AS start_time,
 translate('abcde fg:hi:jk', a.end_time, '_____abcde_fg_hi_jk_____',' ') AS end_time,
 a.number,
 max_sum.max_MB
from (select varchar(entity,45) as entity, MAX(bytes/1024/1024) as max_MB
       from summary
            where activity='BACKUP'
            and
            start_time>=(current_timestamp 7 days)
            and
            entity is not NULL
            group by entity) as max_sum, summary a
 where a.entity=max_sum.entity
  and
  (a.bytes/1024/1024)=max_sum.max_MB
   and
   a.activity='BACKUP'
   and
   a.start_time>=(current_timestamp 7 days)
   and
   a.entity is not NULL
  order by max_sum.entity

1 Ответ

0 голосов
/ 03 апреля 2020

Я не понимаю взаимосвязи между вашим запросом и данными. Но для того, что вы просите, используйте row_number() или rank():

select s.*
from (select s.*,
             row_number() over (partition by entity order by bytes desc, start_time desc) as seqnum
      from summary s
      where . . .
     ) s
where seqnum = 1;
...