在传统的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获得多个输出行。
测试对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 - 但它似乎产生正确的答案。 这只显示至少有一个支持该表示法的DBMS。但是,我有点惊讶,MS SQL Server没有 - 您使用的是哪个版本?
它从来没有停止多久SQL问题不表名称被提交给我惊喜。
您正在使用哪个版本的SQL Server? – 2009-04-16 15:43:52