开发者

Retrieve Rank from sqlite table

Say I have a table in an sqlite DB with two fields: name and age.

Bob|40
Rob|50
Zek|60

How can I query the sq开发者_JAVA技巧lite table for Zek and determine that he is the oldest? More generally, say I have millions of names and ages and I want to query a specific entry, say name="Juju bear", and find the rank of the entry by a different field, e.g. that "Juju bear" is ranked 133455 (by age).

Thanks,

Colorado


You can use a subquery to count the number of people with a higher age, like:

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


Andomar's answer is a good one, and it should almost certainly remain the selected answer for this question. That said ...

I found that a complex query I was running quickly became unwieldy when I tried to shoehorn it into Andomar's solution, so out of desperation, I tried using something like the following code:

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

The important part is the "CREATE TABLE ... AS" part in the first line. I had planned for this to be the first of a few steps, but at least in Firefox's SQLite Manager, I was pleasantly surprised to find that when I dumped my ridiculously long query into a new table, the RDBMS simply added an index column automatically. This column doubles nicely as a "rank" column.

I realize this is a really old question, so this answer probably won't get any upvotes, but I'm posting it in case my personal experience can help someone else with a similar challenge.

Thanks again to Andomar for the original answer -- I imagine it's the most helpful one for most people.


SQLite has a RANK() function

SELECT
    *,
    RANK () OVER ( 
        ORDER BY age DESC
    ) age_rank
FROM
    yourtable

This would return all the entries with a new 3rd row denoting their age rank

in my testing, this also orders the results by the specified order in RANK()

keep in mind that any WHERE clauses you add will affect the ranking, in order to get the rank of one element, you need some nested statements

SELECT 
    * 
FROM (
    SELECT
        *,
        RANK () OVER ( 
            ORDER BY age DESC
        ) age_rank
    FROM
        yourtable
) 
WHERE 
    name = "Zek";

You can also get the nth oldest by doing nested statements

SELECT 
    * 
FROM (
    SELECT
        *,
        RANK () OVER ( 
            ORDER BY age DESC
        ) age_rank
    FROM
        yourtable
) 
WHERE 
    age_rank = 2;

One thing that might matter that i found in my testing is that all values that are the same have the same rank. i personally think this is good but it might matter

Retrieve Rank from sqlite table

RANK() OVER (
    PARTITION BY <expression1>[{,<expression2>...}]
    ORDER BY <expression1> [ASC|DESC], [{,<expression1>...}]
)

pretty good tutorial i found

reference to it in official docs though does not explain how it works

of course the """fun""" of sqlite is that every implementation is different, though its in the official docs so i cant imagine it would be that rare

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜