2016-09-22 1 views
0

서브 쿼리의 상관 관계 캐리어 별 시간순 순번SQL 내가 it.Below 뒤에 논리는 운동과 코드 이해할 수 없었다 아직 며칠 동안 Codecademy에서에서이 운동에 노력하고있다

SELECT carrier, id, 
     (SELECT COUNT(*) 
     FROM flights f 
     WHERE f.id < flights.id 
      AND f.carrier=flights.carrier) + 1 AS flight_sequence_number 
FROM flights; 

내가 f 테이블 flights의 가상 형태라고 이해할 수있다 : 각 추가 비행과 flight_id 증가를 가정 예를 들어 , 우리는 캐리어에 의해 비행, 비행 ID 및 일련 번호를 보려면 다음 쿼리를 사용할 수 있습니다 ,하지만 f.id < flights.id은 무엇을합니까? 그것은

는 MQ 14,979

와 MQ 17107 비교,

는 MQ 2205와 MQ 17107 비교, MQ 7869와 MQ 17107 비교 SQL은

같은 flights의 각 행에 f의 각 행을 비교하는 것을 의미 하는가

......

는 MQ 2205와 MQ 7869을 비교

는 MQ에게 7869 위스콘신 비교 일 MQ 14,979

......

옆에,이 COUNT(*) 정말 어떻게 계산합니까? 그리고 왜 +1? 어떤 도움을 이해할 수있을 것이다 query result

:

은 결과 이미지입니다. 감사.

+1

현재 ID 앞에 비행 횟수를 세고 1을 더하십시오. – jarlh

+1

좋은 프로그래밍 방법에는 두 가지 테이블 별칭이 있습니다. 예 : 여기서 f1과 f2. – jarlh

+1

[modern SQL] (http://modern-sql.com/slides)을 사용하면 간단한 창 함수를 사용하면 훨씬 쉽게 처리 할 수 ​​있습니다. 'row_number (over) (id를 통한 파티션 캐리어 주문)'- 부질의. –

답변

0

쿼리는 테이블 비행에서 레코드를 선택합니다. 각 레코드에 대해 운송 업체, id 및 flight_sequence_number를 선택합니다.

항공편의 모든 레코드에 대해 하위 쿼리가 실행됩니다. 테이블 항공편을 다시 읽지 만 주요 항공사 기록보다 작은 동일한 항공사 및 항공편 ID의 기록 만 가져옵니다. 메인 쿼리 레코드와 서브 쿼리 레코드에 관해 이야기하기 위해서는 하나 또는 두 개의 테이블 별칭이 필요합니다. 그렇지 않으면 두 레코드 모두 flight.id에서와 같이 flight라는 이름이 될 것이기 때문에 어느 페이지에서 말하는 것인지 명확하지 않습니다. 따라서 내부 질의의 테이블은 별칭 f를 얻습니다. 이제 f.id < flights.id와 f.carrier = flights.carrier를 비교할 수 있습니다.

따라서 COUNT (*)는 모든 레코드를 해당 이동 통신사의 주 레코드의 비행 ID보다 낮게 계산하므로 이동 통신사의 행에 번호가 매겨집니다. 가장 작은 ID의 경우 더 작은 ID를 찾을 수 없으므로 카운트가 0이고 하나를 추가하여 행 번호가 1이됩니다. 두 번째로 작은 ID에 대해 하나의 레코드를 찾으면 카운트 1을 얻고 1을 더하고 행 번호 2를 얻습니다 등등.

ORDER BY carrier, id 절로 주문을 추가하면 결과가 더 좋아 보이므로 사용 된 순서대로 결과를 표시하십시오. 언급 한 바와 같이

는 여러 가지 현대적인 DBMS는 ROW_NUMBER 등의 분석 기능을 제공하고 쿼리가 훨씬 간단하게 :

select 
    carrier, 
    id, 
    row_number() over (partition by carrier order by id) as flight_sequence_number 
from flights 
order by carrier, id; 
+0

나는 아직도 당신의 대답을 흡수하고 있습니다. 하지만 고맙습니다. – Eva

0

당신은 당신에게 모든 항공편의 순서를 알려주는 flight_id 항공편의 목록을 가지고 서로 상대적으로찾고있는 쿼리가 수행하려고하는 것은 동일한 운송 업체의 항공편과 관련하여 각 항공편의 순서를 파악하는 것입니다. 예를 들어 50 번째 항공편이 무엇인지 물어 보면 flight_id = 50으로 항공편을 검색 할 수 있기 때문에 쉽습니다.하지만 50 번째 미국 항공기로 무엇을 물었습니까? 조금씩 집계 나 파티션을 사용하지 않고도 테이블을 사용할 수 있습니다.

간단한 선택 쿼리를 살펴 보겠습니다.

SELECT flight_id, carrier 
FROM flights 
WHERE carrier = A 

flight_id, carrier 
------------------ 
    4,  A 
    9,  A 
    10,  A 
    18,  A 
    20,  A 
    25,  A 
    26,  A 

그러나 flight_id 더 이상 일련 번호입니다 우리는 'ID 4 ISN과 캐리어 A. 비행에서 찾고 : 주어진 유형 A의 모든 통신 사업자를 선택한다면, 당신은 이런 식으로 뭔가를 얻을 것 우리 비행 결과의 4 번째 비행 (18 번째 비행). 그러면 데이터를 모아서 각 항공사의 항공편과 관련된 각 항공편의 순서를 파악할 수 있습니다. 그래서 우리가해야 할 일은 각 행 앞에 순서가 같은 유형의 항공편 수를 세는 것입니다. 4 번 항공편에는 이전 유형의 항공편이 없으므로 1 번 순서 (0 번 출발, 1 번 추가로 1 번 순서로 시작)가됩니다. Flight 9는 1 비행을하기 때문에 우리는 시퀀스 2 (+ 1 offset = 2 전에 1 비행)를 갖습니다.

Google 검색 결과의 모든 비행에 대해이 작업을 수행해야하므로 검색어의 선택 부분에 하위 쿼리를 포함 할 수 있습니다. select의 하위 쿼리는 다른 select 쿼리와 비슷하지만 외부 쿼리의 데이터를 사용할 수 있도록 허용하고 외부 쿼리의 결과에 반환되는 모든 행에 대해이 작업을 수행합니다.

우리가 원하는 (순서와 이동 통신사에 따라 비행 순서 번호를 찾습니다) 하위 쿼리는 현재 행의 ID보다 작 으면 각 행 ID를 동일한 테이블의 모든 행과 비교합니다 , 그것은 전에 비행이며 하위 쿼리의 결과에있을 것입니다. COUNT는이 하위 쿼리 결과를 하나의 값으로 집계합니다. 또한 하위 쿼리의 모든 결과가 주요 쿼리에서 확인중인 현재 행의 이동 통신사와 일치하는지 확인합니다. 이 하위 쿼리는 동일한 테이블에서 선택하기 때문에 별칭을 사용해야하며 그렇지 않으면 모호합니다. 따라서 별칭 'f'를 사용하여 기본 쿼리와 구별됩니다. 이 하위 쿼리의 결과에는 새 열에 저장되는 flight_sequence_number라는 이름을 사용할 수도 있습니다. 이렇게하면 모든 항공사의 항공편 순서와 동일한 항공사를 기준으로 한 항공편 순서를 쉽게 알 수 있습니다.

+0

매우 명확하게 해주셔서 감사합니다. 그것은 나를 위해 모든 것을 명료하게합니다. – Eva

관련 문제