[SQL] SQL 그룹에 의해 분 (MySQL의)
SQLSQL 그룹에 의해 분 (MySQL의)
나는 다음과 같은 SQL을 가지고 :
select code, distance from places;
출력은 아래와 같다 :
CODE DISTANCE LOCATION
106 386.895834130068 New York, NY
80 2116.6747774121 Washington, DC
80 2117.61925131453 Alexandria, VA
106 2563.46708627407 Charlotte, NC
난 그냥 하나의 코드와 가장 가까운 거리를 얻을 수 있어야합니다. 내가 원하는 그래서이 돌아갑니다 :
CODE DISTANCE LOCATION
106 386.895834130068 New York, NY
80 2116.6747774121 Washington, DC
나는 원래 이런 일을했다 :
SELECT code, min(distance), location
GROUP BY code
HAVING distance > 0
ORDER BY distance ASC
나는 최소한의 거리와 관련 된 정확한 위치를 취득하지 않은 경우 분 벌금을했다. 나는 분 (거리) 올바른 위치 얻는 방법 (테이블에 삽입의 순서에 따라, 때때로 당신은 뉴욕의 거리에 있지만 위치에서 샬럿으로 끝낼 수있다).
해결법
-
==============================
1.정확한 관련 위치를 얻으려면 최소 거리와 외부 기본 테이블의 경기에서의 거리가 부속 선택에서 파생 된 것을 조건 코드 당 최소 거리를 유도 할 수있는 부속 선택에 가입해야합니다.
정확한 관련 위치를 얻으려면 최소 거리와 외부 기본 테이블의 경기에서의 거리가 부속 선택에서 파생 된 것을 조건 코드 당 최소 거리를 유도 할 수있는 부속 선택에 가입해야합니다.
SELECT a.code, a.distance FROM places a INNER JOIN ( SELECT code, MIN(distance) AS mindistance FROM places GROUP BY code ) b ON a.code = b.code AND a.distance = b.mindistance ORDER BY a.distance
-
==============================
2.당신은 최소 그룹화 및 원래의 테이블 사이에 중첩 된 조회를 수행하려고 할 수 있습니다.
당신은 최소 그룹화 및 원래의 테이블 사이에 중첩 된 조회를 수행하려고 할 수 있습니다.
이 트릭을 할 것 같다
SELECT MinPlaces.Code, MinPlaces.Distance, Places.Location FROM Places INNER JOIN ( SELECT Code, MIN(Distance) AS Distance FROM Places GROUP BY Code HAVING MIN(Distance) > 0 ) AS MinPlaces ON Places.Code = MinPlaces.Code AND Places.Distance = MinPlaces.Distance ORDER BY MinPlaces.Distance ASC
UPDATE : 다음을 사용하여 테스트 :
DECLARE @Places TABLE ( Code INT, Distance FLOAT, Location VARCHAR(50) ) INSERT INTO @Places (Code, Distance, Location) VALUES (106, 386.895834130068, 'New York, NY'), (80, 2116.6747774121, 'Washington, DC'), (80, 2117.61925131453, 'Alexandria, VA'), (106, 2563.46708627407, 'Charlotte, NC') SELECT MinPlaces.Code, MinPlaces.Distance, P.Location FROM @Places P INNER JOIN ( SELECT Code, MIN(Distance) AS Distance FROM @Places GROUP BY Code HAVING MIN(Distance) > 0 ) AS MinPlaces ON P.Code = MinPlaces.Code AND P.Distance = MinPlaces.Distance ORDER BY MinPlaces.Distance ASC
그리고이 수율 :
-
==============================
3.당신은 당신의 DBMS를 말하지 않았다. 다음 솔루션은 SQL 서버를위한 것입니다.
당신은 당신의 DBMS를 말하지 않았다. 다음 솔루션은 SQL 서버를위한 것입니다.
WITH D AS ( SELECT code, distance, location, Row_Number() OVER (PARTITION BY code ORDER BY distance) Seq FROM places ) SELECT * FROM D WHERE Seq = 1
당신은 고유의 코드와 테이블, 다음 [코드, 거리]에서 내 장소 테이블에 인덱스가있는 경우 CROSS이 솔루션은 더 좋을 수 적용 :
SELECT X.* FROM Codes C CROSS APPLY ( SELECT TOP 1 * FROM Places P WHERE C.Code = P.Code ORDER BY P.Distance ) X
나는 훨씬 나중에까지 MySQL을위한 솔루션에 작동하지 않을 수 있습니다.
추신 당신은 삽입 순서에 의존 할 수 없습니다. 시도하지 마!
from https://stackoverflow.com/questions/11683712/sql-group-by-and-min-mysql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 왜 이런 식으로 널 행동은 SQL 날짜 변수를 비교합니까? (0) | 2020.07.16 |
---|---|
[SQL] 어떻게 워드 VBA SQL 쿼리에 따옴표를 다루는? (0) | 2020.07.16 |
[SQL] 열은 IN 절에 존재하지 않지만 SQL 실행 (0) | 2020.07.16 |
[SQL] PHP는 PDO에 오래된는 mysql_query 변경 (0) | 2020.07.16 |
[SQL] 어떻게 SQL Server 2008 R2의 일 / 월 / 연도에 시스템 날짜 형식을 변환하는? (0) | 2020.07.16 |