복붙노트

[SQL] MAX와 GROUP BY (DATE) [중복]

SQL

MAX와 GROUP BY (DATE) [중복]

나는 예를 들어, 테이블의 각 열차에 대한 최신 대상 (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이 아닌 그룹의"를 가지고에 의해. 하지만 확실히 그게 내가 원하는 게 아니에요 ...

그것은 SQL 한 줄에 그것을 할 수 있습니까?

해결법

  1. ==============================

    1.당신은 그룹화되지 않은 사용자의 결과 집합에 집계되지 않은 열을 포함 할 수 없습니다. 기차는 단 하나 개의 목적이있는 경우, 다만, 그렇지 않으면 당신은 당신의 쿼리를 다시 생각해야 조항에 의해 그룹에 대상 열을 추가합니다.

    당신은 그룹화되지 않은 사용자의 결과 집합에 집계되지 않은 열을 포함 할 수 없습니다. 기차는 단 하나 개의 목적이있는 경우, 다만, 그렇지 않으면 당신은 당신의 쿼리를 다시 생각해야 조항에 의해 그룹에 대상 열을 추가합니다.

    시험:

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

    2.

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

    3.여기에 단지 왼쪽을 사용하는 예는 조인 그리고 나는 거기에서 방법으로 어떤 그룹보다 더 효율적이라고 생각 : ExchangeCore 블로그

    여기에 단지 왼쪽을 사용하는 예는 조인 그리고 나는 거기에서 방법으로 어떤 그룹보다 더 효율적이라고 생각 : 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;
    
  4. ==============================

    4.또 다른 방법 :

    또 다른 방법 :

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

    5.만큼 더 중복이없는 것처럼 (그리고 기차가 한 번에 하나 개의 역에 도착하는 경향이있다) ...

    만큼 더 중복이없는 것처럼 (그리고 기차가 한 번에 하나 개의 역에 도착하는 경향이있다) ...

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

    6.나는 파티에 늦게 해요 알고 있지만 이것을 시도 ...

    나는 파티에 늦게 해요 알고 있지만 이것을 시도 ...

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

    SRC : 그룹 CONCAT 문서

    편집 : 고정 된 SQL 구문

  7. from https://stackoverflow.com/questions/3491329/group-by-with-maxdate by cc-by-sa and MIT license