A列をグループとしたときに、B列の最小(最大)値を持つ行だけを取得したいとします。
こんなときは NOT EXISTS を使って最小(最大)値のみに絞り込みます。
例えは、下記のようなテーブルがあるとします。
CREATE TABLE [dbo].[Test](
[Type] [int] NOT NULL,
[ID] [int] NOT NULL,
[Name] [varchar](50) NULL,
[Value] [int] NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[Type] ASC,
[ID] ASC
) ON [PRIMARY]
) ON [PRIMARY]
このテーブルには下記のようにデータが入力されています。
Type 列をグループとして Value の値が最小値を取得する場合、該当するデータは背景色がグレーのデータとなります。
Type ID Name Value 1 1 AAA1 20 1 2 AAA2 10 2 1 BBB1 30 2 2 BBB2 10 2 3 BBB3 20
実際のSELECT文は下記のような感じです。
SELECT
*
FROM Test A
WHERE NOT EXISTS (
SELECT *
FROM Test
WHERE Type=A.Type
AND Value<A.Value
)
サブクエリで取得出来るデータは、該当するデータとは反対のデータです。
メインクエリの Type 値とサブクエリの Type 値が等しく(グループとしてる)、サブクエリの Value 値より メインクエリの Value 値が大きいデータとなります。サブクエリの結果を NOT EXISTS としてるのでその反対、最小値のみとなります。
※最大値の場合は、「Value<A.Value」の「小なり(<)」が「大なり(>)」になります。
上記の SQL 文は SQLServer にて確認しました。
他のベンダーDBでもっと簡単に取得できる方法があるならコメント頂けると助かります。