- PR -

組合せの最大値を取得する方法

投稿者投稿内容
ある
常連さん
会議室デビュー日: 2006/01/21
投稿数: 23
投稿日時: 2006-08-23 18:11
引用:

あしゅさんの書き込み (2006-08-23 16:56) より:
DBの種類がはっきりすれば問題ないのでは?
例えば、Oracleならrownum擬似列、PostgreSQLならlimitで制限できますよ。



仮にOracleとした場合、rownumで出力件数を制限してしまうと

A B C
-------
1 1 A
1 3 B
3 1 C
3 2 D
3 2 F

この場合、rownum<= x で x = 1 の場合、片方出力されないと思うのですが。

私は 年と月を示す数値が別々で格納されているDBから 最新の年月を取得する際は
MAX(年+月の結合)で取得しています。
乳牛
常連さん
会議室デビュー日: 2003/04/15
投稿数: 22
投稿日時: 2006-08-23 18:53
rank関数使っちゃダメですか?

コード:

select *
from (
select t.*
,rank() over(order by t.A ,t.B) as rank
from tbl t
) tt
where tt.rank =1


http://www.atmarkit.co.jp/fdb/rensai/sqlclinic08/sqlclinic08_2.html

[ メッセージ編集済み 編集者: 乳牛 編集日時 2006-08-23 19:14 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-08-23 19:24
こんなWHERE句はいかがでしょうか。

where a * 10000 + b = (select max(a * 10000 + b) from xxxx)

unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-08-23 20:11
引用:

TAKEZOさんの書き込み (2006-08-23 13:21) より:
A B C
-------
1 1 A
1 3 B
3 1 C
3 2 D ←これを取得したい


これってたとえば A が年で B が月だったり、あるいは、A が月で B が日だったり、という良く出くわすパターンですよね。冗長化されていることが、難しさを増している要因だと思います。
素直に考えると、

select * from TABLE
where A = (select max(A) from TABLE)
and B = (select max(B) from TABLE where A = (select max(A) from TABLE))

あたりでできそうな感じです(実際に動かして試してはいませんが)。
これは TAKEZO さんが書かれた SQL にわりと近いものです。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 2006-08-23 22:24
OLAP関数が使えるDBMS(例えば、Oracle, DB2 UDB for LUW、等)なら、
コード:
SELECT a, b, c
  FROM (SELECT T.*
             , DENSE_RANK() OVER( ORDER BY a, b) rank
          FROM Table T
       ) AS S
 WHERE rank = 1


では、いかがでしょうか?
TAKEZO
ベテラン
会議室デビュー日: 2003/12/25
投稿数: 59
投稿日時: 2006-08-24 00:21
返答下さった皆さん有難うございます。RANK関数及びDENSE_RANK関数は初めて知りました。
SQL自体も一番スマートな感じがして良さそうですし、この関数を教えて頂けただけでも
質問して良かったなぁと思いました。

私が書いたSQLは冗長でしたね^^;
unibonさんに書いて頂いたものが私の頭の中で描いていたものです。
まだまだ勉強が足りませんね。反省

[ メッセージ編集済み 編集者: TAKEZO 編集日時 2006-08-24 00:22 ]
ぷさいくろう
ぬし
会議室デビュー日: 2006/08/30
投稿数: 1034
投稿日時: 2006-09-05 12:57
引用:

とんくまさんの書き込み (2006-08-23 22:24) より:
OLAP関数が使えるDBMS(例えば、Oracle, DB2 UDB for LUW、等)なら、
コード:
SELECT a, b, c

FROM (SELECT T.*
, DENSE_RANK() OVER( ORDER BY a, b) rank
FROM Table T
) AS S
WHERE rank = 1


では、いかがでしょうか?



正しくは
DENSE_RANK() OVER(ORDER BY a desc,b desc) rank
やね


[ メッセージ編集済み 編集者: ぷさいくろう 編集日時 2006-09-05 13:04 ]

スキルアップ/キャリアアップ(JOB@IT)