在经典 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 问题的频率总是让我感到惊讶。