#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 был введен первым (на основе даты)