복붙노트

[SQL] SQL 그룹에 의해 분 (MySQL의)

SQL

SQL 그룹에 의해 분 (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. ==============================

    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. ==============================

    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. ==============================

    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을위한 솔루션에 작동하지 않을 수 있습니다.

    추신 당신은 삽입 순서에 의존 할 수 없습니다. 시도하지 마!

  4. from https://stackoverflow.com/questions/11683712/sql-group-by-and-min-mysql by cc-by-sa and MIT license