programing

MAX(날짜)로 그룹화

easyjava 2023. 3. 5. 10:27
반응형

MAX(날짜)로 그룹화

표에 각 열차의 최신 목적지(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 not a GROUP BY expression" 오류가 발생하여 "Dest"를 문장으로 그룹에 포함해야 합니다.하지만 확실히 그건 내가 원하는 게 아니야...

SQL 한 줄에서 할 수 있습니까?

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

그룹화되지 않은 집계되지 않은 열은 결과 집합에 포함할 수 없습니다.열차에 목적지가 1개뿐인 경우, 목적지의 열을 by 절에 의해 그룹에 추가합니다.그렇지 않은 경우 쿼리를 재고해야 합니다.

시험:

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

다음은 왼쪽 참여만 사용하는 예입니다.다른 어떤 그룹보다 효율적이라고 생각합니다.ExchangeCore Blog

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: Group Concat 문서

편집: 고정 SQL 구문

언급URL : https://stackoverflow.com/questions/3491329/group-by-with-maxdate

반응형