Запрос на поиск первой записи для заданных строк или пустой строки - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть таблица, которая содержит заказы.Для любого заданного идентификатора заказа может быть несколько строк (в таблице нет PK).Каждый заказ также имеет временную метку.

Мне дан список заказов, скажем, что order1, order2, и я хочу найти первую запись для этих заказов (или заказ с самой ранней датой).Если заказ для данного идентификатора заказа не существует, то я хочу пустую строку с order_id.

В этом примере допустим, что order1 не существует, а order2 имеет 3 строки (более ранняя строка 2017-01-01).Запрос, который я пытаюсь сделать, должен вернуть этот

order id|  status  | order time | 
order2  | received | 2017-01-01 |
order1  |          |            |

Я думаю, что мне понадобится подзапрос, чтобы сначала найти все заказы для данного, а затем найти самый ранний из него.Но мне трудно понять, а затем сделать этот запрос.

1 Ответ

0 голосов
/ 29 ноября 2018

Вам не нужен подзапрос.Использование оконных функций более эффективно для подобных случаев.Большинство баз данных теперь поддерживают оконные функции / аналитические функции.

Кроме того, если вы ищете заказы по заданному списку, а не по списку заказов в таблице, попробуйте выполнить приведенный ниже пример запроса.Здесь «тестовая» таблица содержит записи о транзакциях, а ARRAY - список заказов, которые вы пытаетесь найти.Вам придется использовать функцию UNNEST, чтобы преобразовать массив в строки, а затем найти, какие идентификаторы порядка не существуют в тестовой таблице.Если бы у вас был список заказов, которые вы хотите найти в другой таблице, запрос мог бы быть написан по-другому.

WITH
dataset AS (
  SELECT ARRAY[1,2,3,4,5] AS items
)
select order_id, status, order_time from
(
select order_id, status, order_time, row_number() over (partition by order_id order by order_time ) rn
from test
union all
 select orders, null, null, 1 from dataset 
  cross join unnest(items) as t(orders) where orders not in (
      select order_id from test
    )
    )
where rn = 1
...