Oracle 11g - исключить записи из набора, в котором столбец часа больше - PullRequest
0 голосов
/ 07 марта 2019

Рассмотрим следующий минимальный пример:

SQL> select key1, key2, key3, hour from teste_jm;

      KEY1       KEY2       KEY3 HOUR
---------- ---------- ---------- -----
        26  992296089       1504 12:30
        26  992296089       1275 13:30

Я бы хотел исключить запись, где KEY3 равен 1275, потому что ее ЧАС больше, чем у записи, где KEY3 равен 1504.

Я попробовал следующее, но безуспешно (я ожидал, что KEY4 будет 1504):

SQL> select key1, key2, key3, hour, min(key3) over (partition by key1, key2, key3 order by to_date(hour, 'HH24:MI')) key4 from teste_jm;

      KEY1       KEY2       KEY3 HOUR        KEY4
---------- ---------- ---------- ----- ----------
        26  992296089       1275 13:30       1275
        26  992296089       1504 12:30       1504

По сути, в Oracle 11g я хотел бы сохранить только записи, чей час самый ранний , для той же пары KEY1, KEY2.

Как бы я это сделал?

РЕДАКТИРОВАТЬ: Вот более полный пример:

SQL> select * from teste_jm;

      KEY1       KEY2       KEY3 HOUR
---------- ---------- ---------- -----
        27  993334444          1 23:00
        27  993334444          2 23:59
        26  992296089       1504 12:30
        26  992296089       1275 13:30

Требуемый вывод для вышеперечисленного:

      KEY1       KEY2       KEY3 HOUR
---------- ---------- ---------- -----
        27  993334444          1 23:00
        26  992296089       1504 12:30

SQLFiddle, содержащий примеры данных здесь .

Ответы [ 3 ]

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

Почему бы вам просто не сгруппировать и получить минимум, и я надеюсь, что приведенный выше пример ввода против o / p правильный, чтобы синхронизироваться с приведенным ниже запросом

     Select  KEY1, KEY2 ,min(KEY3), HOUR 
     from table group by
          KEY1, KEY2
        having HOUR=min(HOUR)
0 голосов
/ 07 марта 2019

Вы близки, но вам нужен подзапрос для фильтрации и правильной логики для минимума:

select key1, key2, key3, hour
from (select key1, key2, key3, hour,
             min(to_date(hour, 'HH24:MI')) over (partition by key1) as min_hour
      from teste_jm
     )  t
where hour = min_hour;
0 голосов
/ 07 марта 2019

попробуйте сделать это

select key1, key2, key3, hour from teste_jm where hour = (select min(hour) from teste_jm);

Э-э, после редактирования попробуйте

select key1, key2, key3, min(hour) OVER (PARTITION BY  key1,key2) from teste_jm;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...