2017-11-25 4 views
1

죄송합니다. 내 제목이 약간 혼란 스럽다면, 어떻게 말을해야할지 모르겠습니다.다른 열의 각 고유 항목에 대해 가장 높은 값과 가장 낮은 값을 반환하는 SQL 쿼리

버스 일정을 나타내는 테이블이 있습니다. 도착 일과 출발 시간, 그리고 정차 순서뿐만 아니라, 모든 여행에서 만들어진 각 정류장에 대한 항목이 있습니다. 예는 :

Trip_ID Arrival  Departure  Stop_ID Stop_Seq 
Trip1 06:00:00 06:00:30  465  1 
Trip1 06:03:45 06:04:15  474  2 
... 
Trip1 06:53:15 06:53:45  169  27 
Trip1 06:56:30 06:57:00  311  28 
Trip2 07:02:00 07:02:30  534  1 
Trip2 07:03:45 07:04:15  700  2 
... 
Trip2 07:41:50 07:42:20  164  35 
Trip2 07:45:30 07:46:00  311  36 

내 목표는 각각의 고유의 즐거운 여행을위한 두 개의 결과를 반환하는 쿼리 가장 낮은 Stop_Seq와 (여행 당) 최고 Stop_Seq와 기록과 기록을 작성하는 것입니다. 예는 :

Trip_ID Arrival  Departure  Stop_ID Stop_Seq 
Trip1 06:00:00 06:00:30  465  1 
Trip1 06:56:30 06:57:00  311  28 
Trip2 07:02:00 07:02:30  534  1 
Trip2 07:45:30 07:46:00  311  36 

나는 다음과 같은 일을하려고했습니다,하지만 난 논리에 의해 그룹의 큰 이해를 가지고 있지 않습니다.

SELECT trip_id,arrival,departure,stop_id,MIN(stop_seq),MAX(stop_seq) 
FROM stop_times 
GROUP BY trip_id; 

불행하게도 그것은 나 또한 배 그룹화 및 정지,하지만 작동하지 않습니다 아니에요 화가 도착, 나는 첫 번째 모든 시간을 원하고 지속되지 않습니다.

제공 할 수있는 도움이 있으면 대단히 감사하겠습니다. :)

답변

0

다음 쿼리는 각각 Stop_Seq이고 가장 높은 숫자가 Stop_SeqTrip 레코드를 반환합니다.

SELECT * 
FROM stop_times a 
WHERE a.Stop_Seq=(
    SELECT MAX(b.Stop_Seq) 
    FROM stop_times b 
    WHERE a.Trip_ID=b.Trip_ID 
) 
or 
a.Stop_Seq=(
    SELECT MIN(b.Stop_Seq) 
    FROM stop_times b 
    WHERE a.Trip_ID=b.Trip_ID 
) 
+0

이 중 하나가 나를 위해 최선을 다했다. @Zorko 솔루션은 Access에서 잘 작동하지 않았지만 내부 조인 문의 별명 사용을 좋아하지 않았습니다. 감사합니다 @Abhilash! – cdav3435

+0

@ cdav3435 감사합니다 ... –

1

Stop_Seq이 고유하면 파생 테이블을 사용할 수 있습니다. 파생 된 테이블은 stop_times 테이블에서 Min 및 Max Stop_Seq을 사용합니다. http://sqlfiddle.com/#!6/b9efc/1/0

당신이 있기 때문입니다 예상대로 작동하지 않았다 그 이유는 여기에

Trip_ID Arrival  Departure Stop_ID Stop_Seq 
Trip1 06:00:00 06:00:30 465  1 
Trip1 06:56:30 06:57:00 311  28 
Trip2 07:02:00 07:02:30 534  1 
Trip2 07:45:30 07:46:00 311  36 

는 전체 코드입니다 :

SELECT dT.Trip_ID 
     ,ST.Arrival 
     ,ST.Departure 
     ,ST.Stop_ID 
     ,dT.Stop_Seq 

    FROM (
     SELECT Trip_ID, MIN(Stop_Seq) AS Stop_Seq FROM stop_times GROUP BY Trip_ID 
     UNION ALL 
     SELECT Trip_ID, MAX(Stop_Seq) FROM stop_times GROUP BY Trip_ID   
     ) AS dT 
      INNER JOIN stop_times ST 
      ON dT.Trip_ID = ST.Trip_ID 
      AND dT.Stop_Seq = ST.Stop_Seq 
ORDER BY Trip_ID 

가 출력 제공합니다 : 수신 쿼리는 세부 사항을 재 취득하기 위해 다시 가입 할 수 있습니다 GROUP BY는 중복을 제거하지만 Arrival, Departure 및 Stop_ID 열의 값이 변경됩니다. 이러한 변경 값은 GROUP BY를 무효화합니다.

0

대체 솔루션. 두 개의 개별 쿼리에서 하위 쿼리를 사용하여 가장 낮은 stop_seq (트립 당)과 가장 높은 stop_seq (트립 당)를 계산합니다. UNION을 사용하여 결과를 결합하십시오.

SELECT a.Trip_ID,a.Arrival, a.Departure, a.Stop_ID, a.Stop_Seq 
FROM stop_times as a 
WHERE a.Stop_Seq = 
(
SELECT Min(b.Stop_Seq) 
FROM stop_times as b 
WHERE b.Trip_ID =a.Trip_ID 
) 
UNION SELECT a.Trip_ID,a.Arrival, a.Departure, a.Stop_ID, a.Stop_Seq 
FROM stop_times as a 
WHERE a.Stop_Seq = 
(
SELECT Max(b.Stop_Seq) 
FROM stop_times as b 
WHERE b.Trip_ID =a.Trip_ID 
); 
관련 문제