2016-07-26 52 views
0
with baseQuery as(
        select id, 
        (select sum(calories) from dailytable where user_id in (select user_id from group_members where group_id=132 and status = 'accepted' and user_id=users.id)) as total_calories 
        from users where id in (select user_id from group_members where group_id=132 and status='accepted')) 
        select *,dense_rank() over(order by total_calories desc nulls last) as rank 
from baseQuery; 

這是我的查詢和輸出如下。如何從結果集中提取特定行的排名

id total_calorie   rank 
    121 2516.054250000001  1 
    25 897.0234000000002  2 
    120 784.13784    3 

我想獲得用戶ID 120只排名,但是當我把這裏的條件對上面的查詢它返回等級爲1,而不是3

我怎樣才能解決這個問題?

回答

2

你可以第一後添加另一個CTE:

with 
baseQuery as 
(
    select id, (select sum(calories) from dailytable where user_id in (select user_id from group_members where group_id=132 and status = 'accepted' and user_id=users.id)) as total_calories 
    from users where id in (select user_id from group_members where group_id=132 and status='accepted') 
), 
ranked_query as 
(
    select *,dense_rank() over(order by total_calories desc nulls last) as rank 
    from baseQuery 
) 
select * from ranked_query where id = 120; 
+0

感謝您的幫助,它可以按我的要求。 –

+0

您可能也可以簡化查詢,因爲您有一個重複的條件在兩個地方過濾用戶ID,但由於內部關聯到外部,至少其中一個是多餘的,可以刪除。 – jpw