Выберите самые последние строки, которые соответствуют условию в SQLite - PullRequest
4 голосов
/ 28 сентября 2010

Допустим, у меня есть таблица:

Name, status, timestamp

И я хочу выбрать строки, которые соответствуют status = 'active', но только те, которые имеют самую последнюю метку времени для каждой из них. Так что, если бы были такие строки:

Bob, active, 5/10/2010
Bob, active, 6/12/2010
Ann, inactive, 6/12/2000
Ann, active, 9/3/2009
Ann, active, 9/25/2010

Я бы хотел, чтобы он вернулся:

Bob, active, 6/12/2010
Ann, active, 9/25/2010

Как я могу это сделать? Я использую SQLite, если это имеет значение.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 28 сентября 2010
select name, status, max(timestamp) 
from my_table 
where status = 'active' 
group by name, status

взгляните на http://www.w3schools.com/sql/sql_groupby.asp

2 голосов
/ 28 сентября 2010

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

SELECT t1.*
FROM MyTable t1
LEFT OUTER JOIN MyTable t2 ON t1.name = t2.name 
  AND t1.timestamp < t2.timestamp
WHERE t2.name IS NULL

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

SELECT t1.*
FROM MyTable t1
LEFT OUTER JOIN MyTable t2 ON t1.name = t2.name 
  AND (t1.timestamp < t2.timestamp OR t1.timestamp = t2.timestamp AND t1.id < t2.id)
WHERE t2.name IS NULL

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

0 голосов
/ 29 сентября 2010

Билл, я полагаю, что теперь он работает (похоже, он подбирает правильные строки на разных тестовых данных).Я использовал ваш запрос и добавил условие t1.active_status! = 'Active', так как он позаботится обо всем, что неактивно.Весь запрос выглядит так:

SELECT t1.*<br>
FROM TrialTypes  t1<br>
LEFT OUTER JOIN TrialTypes t2 ON t1.name = t2.name <br>
  AND (t1.start_date < t2.start_date OR t1.start_date = t2.start_date AND t1.rowid < t2.rowid)<br>
WHERE t2.name IS NULL and t1.active_status != 'active'<br>

Большое спасибо за помощь.Очевидно, я новичок не только в базовых запросах SQL.Это помогает научить меня, спасибо!

...