従来の SQL-92 (Quassnoi で使用される OLAP 操作を使用しない) では、次を使用できます。
SELECT g.ID, g.MaxSignal, t.Station, t.OwnerID
FROM (SELECT id, MAX(Signal) AS MaxSignal
FROM t
GROUP BY id) AS g
JOIN t ON g.id = t.id AND g.MaxSignal = t.Signal;
(チェックされていない構文。テーブルが 't' であると仮定します。)
FROM 句のサブクエリは、各 ID の最大シグナル値を識別します。結合は、それをメイン テーブルの対応するデータ行と結合します。
注意: 特定の ID に対して複数のエントリがあり、すべてが同じ信号強度を持ち、その強度が MAX() である場合、その ID に対して複数の出力行が得られます。
Solaris 10 で動作する IBM Informix Dynamic Server 11.50.FC3 に対してテスト済み:
+ CREATE TEMP TABLE signal_info
(
id INTEGER NOT NULL,
signal INTEGER NOT NULL,
station CHAR(5) NOT NULL,
ownerid INTEGER NOT NULL
);
+ INSERT INTO signal_info VALUES(111, -120, 'Home', 1);
+ INSERT INTO signal_info VALUES(111, -130, 'Car' , 1);
+ INSERT INTO signal_info VALUES(111, -135, 'Work', 2);
+ INSERT INTO signal_info VALUES(222, -98 , 'Home', 2);
+ INSERT INTO signal_info VALUES(222, -95 , 'Work', 1);
+ INSERT INTO signal_info VALUES(222, -103, 'Work', 2);
+ SELECT g.ID, g.MaxSignal, t.Station, t.OwnerID
FROM (SELECT id, MAX(Signal) AS MaxSignal
FROM signal_info
GROUP BY id) AS g
JOIN signal_info AS t ON g.id = t.id AND g.MaxSignal = t.Signal;
111 -120 Home 1
222 -95 Work 1
このテスト用にテーブルに Signal_Info という名前を付けましたが、正しい答えが得られたようです。これは、表記法をサポートする DBMS が少なくとも 1 つあることを示しているだけです。しかし、MS SQL Server がそうではないことに少し驚いています。どのバージョンを使用していますか?
テーブル名なしで SQL の質問が送信される頻度に驚かされます。