在傳統的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