2011-04-15 105 views
8

说我有一个sqlite数据库中有两个字段的表:名称和年龄。从sqlite表检索排名

Bob|40 
Rob|50 
Zek|60 

如何查询Zek的sqlite表,并确定他是最古老的?更一般地说,假设我拥有数百万个姓名和年龄,并且我想要查询特定条目,例如name =“Juju bear”,并且通过不同的字段查找条目的排名,例如, “Juju熊”排名133455(按年龄)。

感谢,

科罗拉多

+4

我意识到你提供了一个简化的例子 - 但存储出生日期或年份,而不是年龄本身,并计算年龄。不要存储年龄本身。如果我多次没有看到这一点,我不会写这个评论。 – Tim 2011-04-16 13:07:39

+0

好点,年龄的变化不是吗? – 2011-04-16 16:11:39

回答

16

您可以使用子查询来计算的人数与年龄较高,如:

select p1.* 
,  (
     select count(*) 
     from People as p2 
     where p2.age > p1.age 
     ) as AgeRank 
from People as p1 
where p1.Name = 'Juju bear' 
4

Andomar的回答是一个很好的,它应该几乎肯定仍然是这个问题的选择答案。这就是说......

我发现一个复杂的查询我当时正在迅速成为笨拙,当我试图把它变成鞋拔子Andomar的解决方案,因此出于绝望,我尝试使用类似下面的代码:

CREATE TABLE DoughnutShopCountsByHood AS 
SELECT Neighborhood, COUNT(*) AS DoughnutShopCount FROM 
( <<crazy-set-of-painful-subqueries-removed>> ) 
GROUP BY Neighborhood ORDER BY DoughnutShopCount DESC; 

重要的部分是第一行中的“CREATE TABLE ... AS”部分。我曾计划过这是第一步,但至少在Firefox的SQLite Manager中,我惊喜地发现,当我将可笑的长查询转储到新表中时,RDBMS会自动添加一个索引列。这个列可以很好地作为“等级”列加倍。

我意识到这是一个非常古老的问题,所以这个答案可能不会得到任何upvotes,但我张贴它,以防我的个人经验可以帮助其他人面临类似的挑战。

再次感谢Andomar的原始答案 - 我想这对大多数人来说是最有帮助的。