Найти "старые" строки - PullRequest
       48

Найти "старые" строки

0 голосов
/ 26 января 2010

Рассмотрим таблицу, подобную этой:

| txn_id | account_id

Я бы хотел сделать один запрос, чтобы получить все txn_ids для всех транзакций, где транзакция не самая последняя (самая высокая txn_id) для account_id.

База данных - MySQL 5.1, что может подразумевать некоторые ограничения в отношении подвыборов.

Ответы [ 4 ]

2 голосов
/ 26 января 2010

Учитывая требование:

Я бы хотел сделать один запрос, чтобы получить все txn_ids для всех транзакций, где транзакция не самая последняя (самая высокая txn_id) для account_id.

кажется, что ответы, которые дают вам идентификаторы транзакций для одной учетной записи за раз, упускают точку запроса.

Чтобы получить список идентификаторов транзакций, которые должны быть сохранены (или проигнорированы), мы можем написать:

SELECT MAX(txn_id) AS max_txn_id, account_id
  FROM UnnamedTable
 GROUP BY account_id;

Теперь нам нужно получить список идентификаторов транзакций, не найденных в этом списке. Это не совсем просто:

SELECT txn_id, account_id
  FROM UnnamedTable
 WHERE txn_id NOT IN
             (SELECT max_txn_id
                FROM (SELECT MAX(txn_id) AS max_txn_id, account_id
                        FROM UnnamedTable
                       GROUP BY account_id
                     )
             )

В любом случае, это нормально работает с IBM Informix Dynamic Server 11.50 и таблицей и данными ниже:

create table unnamedtable(txn_id integer not null, account_id integer not null);
insert into unnamedtable values(1, 12);
insert into unnamedtable values(2, 12);
insert into unnamedtable values(3, 12);
insert into unnamedtable values(4, 13);

дает результаты:

1    12
2    12
2 голосов
/ 26 января 2010

Если я правильно понял

SELECT txn_id
  FROM table
 WHERE txn_id <> (SELECT MAX(txn_id) FROM table WHERE account_id = 123456)
   AND account_id = 123456
1 голос
/ 26 января 2010

Попробуйте что-то вроде этого:

select txn_id, account_id
order by txn_id desc
limit 1,18446744073709551615;
0 голосов
/ 26 января 2010
select txn_id from table 
where account_id = 123 and 
txn_id < (select max(txn_id) from table where account_id = 123)
...