В классическом SQL-92 (без использования операций OLAP, используемых Quassnoi), вы можете использовать:
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 определяет максимальное значение сигнала для каждого идентификатора; объединение объединяет это с соответствующей строкой данных из основной таблицы.
Примечание: если есть несколько записей для определенного идентификатора, которые имеют одинаковую мощность сигнала, и эта сила равна MAX (), то вы получите несколько выходных строк для этого идентификатора.
Протестировано на IBM Informix Dynamic Server 11.50.FC3, работающем в Solaris 10:
+ 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 для этого теста - но, похоже, он дает правильный ответ.
Это только показывает, что существует хотя бы одна СУБД, которая поддерживает обозначения. Тем не менее, я немного удивлен, что MS SQL Server нет - какую версию вы используете?
Меня не перестает удивлять, как часто вопросы SQL отправляются без имен таблиц.