IT

MAX (날짜)를 사용하여 GROUP BY

lottoking 2020. 6. 22. 07:30
반응형

MAX (날짜)를 사용하여 GROUP BY [중복]


이 질문에는 이미 답변이 있습니다.

예를 들어 테이블에 각 열차의 최신 목적지 (MAX 출발 시간)를 나열하려고합니다 .

Train    Dest      Time
1        HK        10:00
1        SH        12:00
1        SZ        14:00
2        HK        13:00
2        SH        09:00
2        SZ        07:00

원하는 결과는 다음과 같아야합니다.

Train    Dest      Time
1        SZ        14:00
2        HK        13:00

나는 사용을 시도했다

SELECT Train, Dest, MAX(Time)
FROM TrainTable
GROUP BY Train

에 의해 그룹 별 문에 '대상'을 포함해야한다는 "ora-00979 GROUP BY식이 아님"오류가 발생했습니다. 그러나 분명히 그것은 내가 원하는 것이 아닙니다 ...

한 줄의 SQL로 할 수 있습니까?


그룹화되지 않은 결과 집합에 집계되지 않은 열을 포함 할 수 없습니다. 열차에 목적지가 하나만있는 경우 그룹 별 절에 목적지 열을 추가하면됩니다. 그렇지 않으면 쿼리를 다시 생각해야합니다.

시험:

SELECT t.Train, t.Dest, r.MaxTime
FROM (
      SELECT Train, MAX(Time) as MaxTime
      FROM TrainTable
      GROUP BY Train
) r
INNER JOIN TrainTable t
ON t.Train = r.Train AND t.Time = r.MaxTime


SELECT train, dest, time FROM ( 
  SELECT train, dest, time, 
    RANK() OVER (PARTITION BY train ORDER BY time DESC) dest_rank
    FROM traintable
  ) where dest_rank = 1

다음은 왼쪽 조인 만 사용하는 예제이며 여기에서 방법으로 그룹보다 효율적이라고 생각합니다. ExchangeCore 블로그

SELECT t1.*
FROM TrainTable t1 LEFT JOIN TrainTable t2
ON (t1.Train = t2.Train AND t1.Time < t2.Time)
WHERE t2.Time IS NULL;

다른 해결책 :

select * from traintable
where (train, time) in (select train, max(time) from traintable group by train);

중복이없는 한 (그리고 기차는 한 번에 한 역에만 도착하는 경향이 있습니다) ...

select Train, MAX(Time),
      max(Dest) keep (DENSE_RANK LAST ORDER BY Time) max_keep
from TrainTable
GROUP BY Train;

나는 파티에 늦었다는 것을 알고 있지만 이것을 시도하십시오 ...

SELECT 
    `Train`, 
    `Dest`,
    SUBSTRING_INDEX(GROUP_CONCAT(`Time` ORDER BY `Time` DESC), ",", 1) AS `Time`
FROM TrainTable
GROUP BY Train;

Src : 그룹 Concat 설명서

편집 : 고정 SQL 구문

참고 URL : https://stackoverflow.com/questions/3491329/group-by-with-maxdate

반응형