Проверить, будет ли MIN работать над ROW_NUMBER

#sql #sql-server

#sql #sql-сервер

Вопрос:

Ситуация:

У меня есть три столбца:

  • ID
  • Дата
  • tx_id

Основным столбцом id является tx_id и он уникален в таблице. Каждый tx_id привязан к идентификатору и имеет дату записи. Я хотел бы проверить, является ли tx_id инкрементным.

Цель:

Мне нужно извлечь первый tx_id по идентификатору, но я хочу предотвратить использование ROW_NUMBER , т.е

select id, date, tx_id, row_number() over(partition by id order by date asc) as First_transaction_id from table

и просто используйте

select id, date, MIN(tx_id) as First_transaction_id from table

Итак, как я могу убедиться, что, поскольку у меня более 50 миллионов идентификаторов, использование MIN tx_id приведет к самой ранней транзакции для каждого идентификатора?

Как я могу добавить столбец флага, чтобы сегментировать те, которые не удовлетворяют условию?

Ответ №1:

как я могу убедиться, что, поскольку у меня более 50 миллионов идентификаторов, использование MINtx_id приведет к самой ранней транзакции для каждого идентификатора?

Просто выполните сравнение:

Вы можете получить исключения с логикой, подобной этой:

 select t.*
from (select t.*,
              min(tx_id) over (partition by id) as min_tx_id,
              rank() over (partition by id order by date) as seqnum
      from t
     ) t
where tx_id = min_tx_id and seqnum > 1;
  

Примечание: при этом используется rank() . Представляется возможным, что для id могут быть две транзакции на одну и ту же дату.

Комментарии:

1. я повозился, и, кажется, это работает, но я получил исключение system out of memory при использовании его для фактических данных. есть ли причина для этого?

Ответ №2:

используйте corelated sunquery

 select t.* from table_name t
where t.date= ( select min(date) from table_name
                 t1 where t1.id=t.id)
  

Комментарии:

1. хотя, как я могу убедиться, что tx_id является инкрементным и, следовательно, наименьший tx_id был введен первым (на основе даты)