выберите максимальную запись из таблицы - PullRequest
0 голосов
/ 25 октября 2019

У меня есть таблица, которая содержит Order_id, hour, location_code. Каждая запись соответствует идентификатору заказа, местоположению, в котором она размещена, и времени, когда она была зарегистрирована в этом месте, например, следующий пример:

ORDER_ID |            HOUR       |LOCATION_CODE
10910568 | 1899-12-30 04:25:40   |   168
10910568 | 1899-12-30 00:44:04   |   96
10910568 | 1899-12-30 04:18:00   |  217
10910568 | 1899-12-30 04:25:41   |    6
10910569 | 1899-12-30 04:25:40   |  168
10910569 | 1899-12-30 00:44:04   |   96
10910569 | 1899-12-30 04:18:00   |  217
10910569 | 1899-12-30 04:25:42   |    7

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

ORDER_ID |       HOUR           |LOCATION_CODE
10910568 | 1899-12-30 04:25:41  |      6
10910569 | 1899-12-30 04:25:42  |      7

Исходная таблица очень большая, поэтому мне нужно извлекать эту информацию для каждого ORDER_ID.

Как мне это сделать?

Ответы [ 3 ]

2 голосов
/ 25 октября 2019

Вы можете сделать это, используя row_number ()

    Select ORDER_ID, hour,   
      LOCATION_CODE from (select 
       ORDER_ID, hour,   
      LOCATION_CODE, row_number()
     over (partition by order_id order by
     Hour desc) rn from table) t where
      t.rn=1
2 голосов
/ 25 октября 2019

Если таблица очень большая, я предлагаю вам получить максимум HOUR для каждого ORDER_ID в запросе с простым GROUP BY ORDER_ID и присоединиться к таблице:

select t.*
from tablename t inner join (
  select order_id, max(hour) maxhour
  from tablename
  group by order_id
) g on g.order_id = t.order_id and g.maxhour = t.hour 

См. демо . Результаты:

| ORDER_ID | HOUR                | LOCATION_CODE |
| -------- | ------------------- | ------------- |
| 10910568 | 1899-12-30 04:25:41 | 6             |
| 10910569 | 1899-12-30 04:25:42 | 7             |
1 голос
/ 25 октября 2019

Используйте коррелированный подзапрос:

select t.* 
from mytable t
where hour = (select max(t1.hour) from mytable t1 where t1.order_id = t.order_id)

С индексом (order_id, hour) это должно быть очень эффективным решением.

В качестве альтернативы вы также можете использовать order byи first 1 в подзапросе вместо агрегации:

select t.* 
from mytable t
where hour = (
    select first 1 hour from mytable t1 where t1.order_id = t.order_id order by hour desc
)
...