5

この質問の言い方がわかりませんが、複数の行に適用される集計クエリが必要です。うまくいけば、例がこれをより簡単にするはずです。次のデータがあると仮定します。

  player  | year | games
-------------------------
ausmubr01 | 2006 | 139
ausmubr01 | 2007 | 117
bondsba01 | 2006 | 130
bondsba01 | 2007 | 126
stairma01 | 2006 | 26
stairma01 | 2006 | 77
stairma01 | 2006 | 14
stairma01 | 2007 | 125

そして、各年の各プレーヤーについて、「キャリア年」、つまりプレーしている年数を計算したいと思います。

  player  | year | games | cyear
 --------------------------------
ausmubr01 | 2006 | 139   |  1
ausmubr01 | 2007 | 117   |  2
bondsba01 | 2006 | 130   |  1
bondsba01 | 2007 | 126   |  2
stairma01 | 2006 | 26    |  1
stairma01 | 2006 | 77    |  2
stairma01 | 2006 | 14    |  3
stairma01 | 2007 | 125   |  4

この変換を次のように表現するのは自然なことSELECT player, year, games, year - min(year) + 1 as cyear FROM baseball GROUP by playerですが、集計クエリのルールにより、式はグループごとに 1 回だけ評価されます。

  player  | year | games | cyear
 --------------------------------
ausmubr01 | 2006 | 139   |  1
bondsba01 | 2006 | 130   |  1
stairma01 | 2006 | 26    |  1

一般的にこの問題を克服するにはどうすればよいですか (つまり、この場合だけでなく、既存の列と集計関数で計算された単一のグループごとの数値を組み合わせて算術演算を実行する場合)?

4

4 に答える 4

3

簡単な方法の 1 つは、各プレーヤーの開始年を集計クエリとして計算し、データを元のデータと結合することです。これらの種類の「シーケンスベース」のクエリは、通常、セットベースの言語で表現するのが難しいです:(

WITH tmp as (
  select player, min(year) as minyear 
  from table 
  group by player
);

select t.*, t.year - t.minyear + 1 as cyear
from table as t, tmp
where t.player = tmp.player;
于 2013-05-13T21:46:47.220 に答える
1

WITH または OVER がない場合は、... 実際のデータベースを取得します。それができない場合は、サブクエリを使用して実行できます。

SELECT t.*, t.year - subtable.minyear + 1 AS cyear
FROM table AS t
JOIN (
  select player, min(year) as minyear 
  from table 
  group by player
) AS SubTable
ON T.player = SubTable.player
于 2013-05-14T00:52:00.600 に答える