选择与SQLite中的条件匹配的最新行

时间:2010-09-28 03:47:44

标签: sql sqlite select greatest-n-per-group

假设我有一张桌子:

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 个答案:

答案 0 :(得分:4)

select name, status, max(timestamp) 
from my_table 
where status = 'active' 
group by name, status

看看http://www.w3schools.com/sql/sql_groupby.asp

答案 1 :(得分:2)

以下是我解决此类问题的方法。您希望每个名称都有一行,以便不存在具有相同名称和更大时间戳的其他行:

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是此示例的主键,但是按时间顺序增加值的任何其他唯一列都可以正常工作。

答案 2 :(得分:0)

比尔,我相信我现在有效(似乎在不同的测试数据上选择了正确的行)。我使用了你的查询并添加了条件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查询。这有助于教我,谢谢!