选择与SQLite中的条件匹配的最新行
假设我有一张桌子:选择与SQLite中的条件匹配的最新行,sql,sqlite,select,greatest-n-per-group,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,
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
多谢各位
select name, status, max(timestamp)
from my_table
where status = 'active'
group by name, status
看看我是如何解决这类问题的。您希望每个名称对应一行,以便不存在具有相同名称和更大时间戳的其他行:
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
选择t1*
来自MyTableT1
t1.name=t2.name上的左侧外部联接MyTable t2
t1.timestamp
但这仍然可以为每个名称返回多行,因为对于具有相同最大时间戳的给定名称,可以有多行。因此,将主键用作连接断路器:
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
选择t1*
来自MyTableT1
t1.name=t2.name上的左侧外部联接MyTable t2
和(t1.timestamp
我假设
id
是本例的主键,但是任何其他按时间顺序增加值的唯一列都可以工作。比尔,我相信我现在已经可以工作了(似乎在不同的测试数据上选择了正确的行)。我使用了您的查询并添加了条件t1.active\u status!='“活动”,因为这将处理任何不活动的内容。整个查询如下所示:
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>
选择t1.*
来自试验类型t1
t1上的左外联接试验类型t2.name=t2.name
和(t1.start_date
其中t2.name为NULL,t1.active_status!='活动'
非常感谢你的帮助。显然,我不熟悉基本的SQL查询。这有助于教我,谢谢 我已经添加了
best-n-per-group
标记。其他许多与你的问题几乎完全相同的问题都要遵循这个标签。