Trong SQL-92 (không sử dụng các hoạt động OLAP sử dụng bởi Quassnoi), sau đó bạn có thể sử dụng cổ điển:
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;
(cú pháp không được kiểm soát; giả bảng của bạn là 't'.)
Truy vấn phụ trong mệnh đề FROM xác định giá trị tín hiệu tối đa cho mỗi id; phép nối kết hợp với hàng dữ liệu tương ứng từ bảng chính. NB: nếu có một số mục nhập cho một ID cụ thể mà tất cả đều có cùng cường độ tín hiệu và cường độ đó là MAX(), thì bạn sẽ nhận được một số hàng đầu ra cho ID đó.
Tested chống lại IBM Informix Dynamic Server 11.50.FC3 chạy trên 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
Tôi đặt tên cho bảng Signal_Info cho thử nghiệm này - nhưng có vẻ như để tạo ra câu trả lời đúng. Điều này chỉ cho thấy có ít nhất một DBMS hỗ trợ ký pháp. Tuy nhiên, tôi hơi ngạc nhiên khi MS SQL Server không - bạn đang sử dụng phiên bản nào?
Nó không bao giờ hết làm tôi ngạc nhiên khi các câu hỏi SQL thường được gửi mà không có tên bảng.
Bạn đang sử dụng phiên bản SQL Server nào? –