Получение определенных столбцов из строк, в которых возникло значение MAX

Поэтому я пытаюсь вставить только те строки, которые связаны с ЧАСОМ, в котором произошло значение MAX. Однако я группирую по дням, а позже буду группировать по неделям, месяцам, годам и т. д. Верен ли мой подход? Причина, по которой я использую подзапрос, заключается в том, что мне нужно получить значение, которое входит в столбец HR, но добавление его в GROUP BY испортит мои ежедневные группировки (если это имеет смысл). Мне нужны определенные значения из этих столбцов для вставки с помощью написанной мной хранимой процедуры. Правильно ли направлен мой запрос ниже? Заранее спасибо

Ниже приведены некоторые образцы данных:

VALUE_ID      VALUE     HR                           VALUE_TYPE   OFFSET  DATA_CODE
   1            75      DEC-25-2018 01:00:00 AM      Bananas        1    HI
   2            10      DEC-25-2018 02:00:00 AM      Bananas        1    HI
   3             0      DEC-25-2018 03:00:00 AM      Bananas        1    HI
   4            77      DEC-25-2018 04:00:00 AM      Bananas        1    HI
   5            787     DEC-25-2018 05:00:00 PM      Bananas        1    HI

Что я хочу:

VALUE_ID      VALUE     HR                           VALUE_TYPE   OFFSET  DATA_CODE
   5            787     DEC-25-2018 05:00:00 PM      Bananas        1    HI  


SELECT v.value AS MAX_VALUE
     , v.offset
     , v.data_code
     , v.hr
     , v.code
     , v.data_date
     , to_date(to_char(to_date(lpad(v.data_date, 7, 0), 'DDDYYYY'), 'MM/DD/YYYY'), 'MM/DD/YYYY') as converted_date
FROM value v
inner join sub_value sv on v.value_id = sv.value_id
Where v.Value_id IN (select VALUE_ID from(
select  MAX(v.value) as MAX_VALUE
      , MAX(v.offset) as OFFSET
      , v.data_Code
      , MAX(v.value_id) as VALUE_ID
      , v.code
      , v.data_date
      , to_date(to_char(to_date(lpad(v.data_date, 7, 0), 'DDDYYYY'), 'MM/DD/YYYY'), 'MM/DD/YYYY') as converted_date
  from value v
  inner join sub_value sv on v.value_id = sv.value_id;

Также: Будет ли процесс такой же и для еженедельного MAX? (конечно, я собираюсь преобразовать дату / время в IW (неделя), но помимо этого)

🤔 А знаете ли вы, что...
SQL поддерживает агрегирование данных с использованием операторов GROUP BY и HAVING.


1
36
1

Ответ:

Решено

Один простой метод использует row_number() или rank(). Вот пример, предполагающий, что вам нужен максимум для каждого data_code:

select t.*
from (select t.*, row_number() over (partition by data_code order by value desc) as seqnum
      from t
     ) t
where seqnum = 1;