在经典的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支持这种表示法。然而,我有点惊讶的是MS SQL Server不支持 - 你使用的是哪个版本?
SQL问题经常被提交,但没有表名,这总是让我感到惊讶。