Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择与SQLite中的条件匹配的最新行_Sql_Sqlite_Select_Greatest N Per Group - Fatal编程技术网

选择与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
标记。其他许多与你的问题几乎完全相同的问题都要遵循这个标签。