7

最大行を取得してからその行の値を取得するために、同じテーブルを少なくとも 2 回検索せずにこれを行うのに苦労しています。問題のテーブルは非常に大きいため、これは受け入れられません。

私のテーブルは次のようになります。

SCORES
ID    ROUND    SCORE
1     1        3
1     2        6
1     3        2
2     1        10
2     2        12
3     1        6

各 ID が最新のラウンドで獲得したスコアを返す必要があります。つまり、最大 (ラウンド) の行ですが、最大スコアではありません。

OUTPUT:
ID   ROUND   SCORE
1    3       2
2    2       12
3    1       6

今私は持っています:

SELECT * FROM 
(SELECT id, round,
CASE WHEN (MAX(round) OVER (PARTITION BY id)) = round THEN score ELSE NULL END score
 FROM
 SCORES
 where id in (1,2,3)
) scorevals
WHERE
scorevals.round is not null;

これは機能しますが、かなり非効率的です (そもそもこれらの行を取得できないはずなのに、これらの行をすべて手動で除外する必要があります)。

正しい値を取得するにはどうすればよいですか?

4

3 に答える 3

7

これは、サブクエリなしでも可能です。

SELECT DISTINCT
       id
      ,max(round) OVER (PARTITION BY id) AS round
      ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score
FROM   SCORES
WHERE  id IN (1,2,3)
ORDER  BY id;

あなたが求めたものを正確に返します。
重要な点は、ウィンドウ関数の後にDISTINCT適用されることです。

SQL フィドル。

同じウィンドウを2回使用するため、おそらく高速です。

SELECT DISTINCT
       id
      ,first_value(round) OVER (PARTITION BY id ORDER BY round DESC) AS round
      ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score
FROM   SCORES
WHERE  id IN (1,2,3)
ORDER  BY id;

そうでなければ同じことをします。

于 2012-04-26T23:04:58.473 に答える
5

分析関数を使用して正しい方向に進んでいます。rankしかし、おそらく関数でこのようなものが必要です

SELECT *
  FROM (SELECT a.*,
               rank() over (partition by id order by round desc) rnk
          FROM scores
         WHERE id IN (1,2,3))
 WHERE rnk = 1

id同順位 (とが同じ行) が存在する可能性がある場合は、 --の代わりに分析関数roundを使用することをお勧めします。これにより、両方を返すのではなく、2 つの同順位の行のいずれかを任意に選択して aを 1 にします。row_numberrankrnkrank

分析関数を使用したい場合は、次のMAXようなこともできます

SELECT *
  FROM (SELECT a.*,
               MAX(round) OVER (partition by id) max_round
          FROM scores
         WHERE id IN (1,2,3))
 WHERE round = max_round
于 2012-04-26T22:44:19.387 に答える
0

この種の問題については、次のmax...keep...dense_rank構文を使用する傾向があります。

select
  id,
  max(round)  round,
  max(score) keep (dense_rank last order by round) score
from
  tq84_scores
group by
  id;

SQLフィドル

于 2015-01-06T16:49:14.303 に答える