2016-07-26 6 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 

上記のクエリの条件はそれが1ではなく3

どのように私はこの問題を解決することができるよう、ランクを返している場合、私は入れていたとき、私は、ユーザID 120の唯一のランクを取得したいけど?

答えて

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

あなたは2つの場所でユーザIDをフィルタリングする繰り返し条件があるので、おそらくクエリを少し簡略化できますが、内側のものが外側に関連付けられているため、少なくとも1つは冗長であり、削除することができます。 – jpw

関連する問題