에 의해 GROUP과 (하위 쿼리를 통해) 두 번째로 낮은 값을 선택SQL : ... 위치로 분류 진수 값의 데이터베이스 감안할 때 절
CREATE TABLE ItemPrices
(`Company` varchar(11), `LocationID` char(5), `ProductLevel` varchar(11), `LowPrice` decimal(5,2))
;
INSERT INTO ItemPrices
(`Company`, `LocationID`, `LowPrice`)
VALUES
('Company 1', 10001, 100.00),
('Company 2', 10001, 200.00),
('Company 3', 10001, 300.00),
('Company 4', 10001, 400.00),
('Company 1', 10002, 10.00),
('Company 2', 10002, NULL),
('Company 3', 10002, 30.00),
('Company 4', 10002, 40.00)
;
그것은 위치에 대한 가장 낮은 값을 선택하기 쉽습니다 : 예상대로 작동하지 않는 가장 낮은 값을 필터링하고 다음으로 낮은 값을 반환하는 하위 쿼리를 사용하여
SELECT LocationID,min(LowPrice) FROM ItemPrices GROUP BY LocationID;
LOCATIONID MIN(LOWPRICE)
10001 100
10002 10
그러나
:SELECT LocationID,min(LowPrice) FROM ItemPrices
WHERE LowPrice >
(SELECT min(LowPrice)
FROM ItemPrices)
GROUP BY LocationID;
LOCATIONID MIN(LOWPRICE)
10001 100
10002 30
결과는 위치 ID 10001의 두 번째 최저 가격이 100이 아닌 200으로 표시되어야합니다.
모든 경우에 하위 쿼리가 단지 최저 LowPrice
(10)을 반환하는 것으로 보입니다. 적절한 논리는 특정 값이 가장 낮은 값인 LocationID
(100)을 찾은 다음 더 큰 값인 LocationID
(200)을 찾아 더 큰 값을 반환하는 것입니다.
서브 쿼리가 가격의 하위 집합 만 평가해야한다는 것을 어떻게 인식시킬 수 있습니까?
여기에 GROUP BY
을 입력하면 (LowPrice > (SELECT min(LowPrice) FROM ItemPrices GROUP BY LocationID)
) Subquery returns more than 1 row
이라고 표시됩니다. 당연히 모든 LocationID
에 대해 하나의 행을 반환합니다.