- 締切済み
最新かつ最大の値を求める
一つのテーブル(TABLE_A)に次のフィールドがあります。 SEQ_RID, TARGET_REGION, YEAR, SELL_PRICE 1 , 1 , 1997, 1100 2 , 1 , 1997, 1700 3 , 1 , 1997, 1300 4 , 2 , 1997, 1400 5 , 2 , 1997, 1500 6 , 2 , 1998, 1700 7 , 2 , 1998, 1800 8 , 2 , 1998, 1200 .... 各TRAGET_REGION別の最新年(YEAR)の最大売上(SELL_PRICE)を 求めたいと思います。 MAX関数を二つ使うのはだめみたいです。 宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- nora1962
- ベストアンサー率60% (431/717)
ANo.2です。 後段のSQL試してみました? これならSQLServer2000でもいけると思ったんですが。
- nora1962
- ベストアンサー率60% (431/717)
postgreSQLなんかだと select * from t1 x where not exists ( select 1 from t1 y where x.TARGET_REGION=y.TARGET_REGION and ( x.YEAR, x.SELL_PRICE ) < ( y.YEAR ,y.SELL_PRICE ) ); でいけると思うけど。SQLServerとかORACLEでは行構築子の大小比較が できないから。 select * from t1 x where not exists ( select 1 from t1 y where x.TARGET_REGION=y.TARGET_REGION and ( x.YEAR<y.YEAR or ( x.YEAR=y.YEAR and x.SELL_PRICE<y.SELL_PRICE ) ) ); でどうでしょう。
お礼
Postgreでの解決策、教えてくださって、 ありがとうございます。
- chukenkenkou
- ベストアンサー率43% (833/1926)
SQL SERVERのバージョンは? >MAX関数を二つ使うのはだめみたいです。 何がどうだめなのですか? 丸投げにせず、自分なりに考えたSQLを提示してくれれば、どこに問題があるか具体的に示せるのですけどね。また、丸投げは、ここの規約違反ですし。 単純にMAX値を得るのでなく、TARGET_REGION毎に最大のYEARを求め、その同じ行の中でMAXのSELL_PRICEを求める必要があるので、その辺の条件が足らないのでは? SQL SERVER 2005以降なら、分析関数を使用できます。 SELECT * FROM (SELECT RANK() OVER(PARTITION BY TARGET_REGION ORDER BY "YEAR" DESC,SELL_PRICE DESC) AS RK, * FROM TABLE_A) AS X WHERE X.RK=1 ORDER BY TARGET_REGION
お礼
ご回答及びご指導、ありがとうございます。 自分なりに考えたのは、以下のものです。 select t1.TARGET_REGION, t1.MAX_YEAR, t2.MAX_SELL_PRICE --地域ごとの最新年度を求める (select TARGET_REGION, MAX(YEAR) MAX_YEAR from TABLE_A group by TARGET_REGION) as t1, --地域毎年度毎の最高の売上を求める (select TARGET_REGION, YEAR, MAX(SELL_PRICE) MAX_SELL_PRICE from TABLE_A group by TARGET_RGION, YEAR) as t2 where t1.TARGET_REGION = t2.TARGET_REGION and t1.MAX_YEAR = t2.YEAR お時間が許される限り、ご検討いただければと思います。 ありがとうございます。
お礼
後段のSQLを試してみました。 最初はPostgreのみだと思い込みまして、SQL2000では実行できないと おもいましたが、改めてテストしてみた結果うまくいきました。 本当にありがとうございます。 ちなみに、同じ年度の最高の売上が複数存在する場合を想定してdistinctをつけました。 select distinct TARGET_REGION, YEAR, SELL_PRICE from test1 x where not exists ( select 1 from test1 y where x.TARGET_REGION=y.TARGET_REGION and ( x.YEAR<y.YEAR or ( x.YEAR=y.YEAR and x.SELL_PRICE<y.SELL_PRICE ) ) ); もう一度お礼を申し上げます、ありがとうございます。