programing

SQL에서 열의 최대값이 있는 행만 선택

bestcode 2022. 11. 6. 10:31
반응형

SQL에서 열의 최대값이 있는 행만 선택

다음 문서 표가 있습니다(간체판 여기).

아이디 리비전 내용
1 1 ...
2 1 ...
1 2 ...
1 3 ...

을 선택하고 큰 revid만 요?
데이터를 에는 두 행이 포함됩니다. 즉, 결과에는 두 행이 됩니다.[1, 3, ...] ★★★★★★★★★★★★★★★★★」[2, 1, ..]MySQL을 사용하고 있습니다.

.whileloop을 사용하여 결과 집합에서 오래된 리비전을 검출하고 덮어씁니다.하지만 이것이 그 결과를 얻기 위한 유일한 방법일까?SQL 솔루션은 없나요?

언뜻 보면...

한 은 ★★★★★★★★★★★★★★★★★★★★★★★★GROUP BY「」가 절MAX약약: :

SELECT id, MAX(rev)
FROM YourTable
GROUP BY id

그렇게 간단하지 않아요, 그렇죠?

는 방금 에게 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★content컬럼도 마찬가지입니다.

이것은 SQL에서 매우 일반적인 질문입니다.일부 그룹 식별자별로 컬럼에 최대값이 있는 행의 전체 데이터를 찾습니다.그런 말 많이 들었어요.사실, 그것은 제가 현재 근무하고 있는 회사의 기술 면접에서 대답한 질문 중 하나였습니다.

Stack Overflow 커뮤니티는 이러한 질문에 대응하기 위해 단일 태그를 만드는 것이 일반적입니다.그룹당 n개입니다.

기본적으로 이 문제를 해결하려면 다음 두 가지 방법이 있습니다.

한 ★★★★★★★★group-identifier, max-value-in-group

접근법에서는 '어울리다'를 수 있습니다.group-identifier, max-value-in-group(일부러) 일부러지다 두 가지 됩니다.group-identifier ★★★★★★★★★★★★★★★★★」max-value-in-group:

SELECT a.id, a.rev, a.contents
FROM YourTable a
INNER JOIN (
    SELECT id, MAX(rev) rev
    FROM YourTable
    GROUP BY id
) b ON a.id = b.id AND a.rev = b.rev

Left Join with Self, Join 조건 및 필터 조정

이 접근방식에서는 테이블과 함께 자리를 뜨게 됩니다.은 평등에 .group-identifier한 움직임 럼 2 、 2 개개개: :

  1. 두 번째 조인 조건은 왼쪽 값이 오른쪽 값보다 작습니다.
  2. 1 을 하면, 에는, 「1」이 .NULL른른그그그그)LEFT JOIN 결과 이 '아니다'합니다.NULL.

결과적으로 다음과 같은 결과가 됩니다.

SELECT a.*
FROM YourTable a
LEFT OUTER JOIN YourTable b
    ON a.id = b.id AND a.rev < b.rev
WHERE b.id IS NULL;

결론

두 방법 모두 동일한 결과를 가져옵니다.

이 2 개 경우max-value-in-group★★★★★★에group-identifier두 행 모두 두 접근법의 결과에 포함됩니다.

두 방법 모두 SQL ANSI와 호환되므로 "즐겨찾기"에 관계없이 즐겨찾기 RDBMS에서 작동합니다.

두 가지 접근 방식 모두 성능에 도움이 되지만 주행 거리가 다를 수 있습니다(RDBMS, DB Structure, 인덱스 등).따라서 다른 접근 방식보다 하나의 접근 방식을 선택할 때는 벤치마크를 해야 합니다.그리고 당신에게 가장 의미 있는 것을 고르도록 하세요.

가능한 한 적은 코드를 사용하는 것이 좋습니다.

하다, 하다, 하다를 사용해서 할 수 있어요.IN이것을 시험해 보세요.

SELECT * 
FROM t1 WHERE (id,rev) IN 
( SELECT id, MAX(rev)
  FROM t1
  GROUP BY id
)

내 생각에 그것은 덜 복잡하다...읽기 쉽고 유지보수가 용이합니다.

SQL 창 기능 솔루션에 대한 답변이 없다는 사실에 깜짝 놀랐습니다.

SELECT a.id, a.rev, a.contents
  FROM (SELECT id, rev, contents,
               ROW_NUMBER() OVER (PARTITION BY id ORDER BY rev DESC) ranked_order
          FROM YourTable) a
 WHERE a.ranked_order = 1 

SQL 표준 ANSI/ISO 표준 SQL:2003 이후 ANSI/ISO 표준 SQL:2008에서 추가된 윈도(또는 윈도) 기능은 현재 모든 주요 벤더에서 사용할 수 있습니다.문제에 사용할 수 는 다음과 같습니다.RANK, DENSE_RANK, PERSENT_RANK.

또 다른 솔루션은 다음과 같은 관련 서브쿼리를 사용하는 것입니다.

select yt.id, yt.rev, yt.contents
    from YourTable yt
    where rev = 
        (select max(rev) from YourTable st where yt.id=st.id)

(id,rev)에 인덱스를 붙이면 서브쿼리가 거의 단순한 룩업처럼 렌더링됩니다.

다음은 @AdrianCarneiro의 답변(서브쿼리, leftjoin)과 비교한 것입니다.MySQL 측정치를 바탕으로 한 InnoDB 테이블은 약 100만개이며 그룹 크기는 1-3개입니다.

서브쿼리/ 6/9 로 만, 또는배치에 는, 「」/leftjoin/correlated timing」이 (「/leftjoin/correlated timing」).id in (1,2,3)(서브쿼리 재실행으로 인해) 서브쿼리가 다른 서브쿼리보다 훨씬 느립니다.다만, 레프트 조인과 상관 솔루션의 속도를 구별할 수 없었습니다.

마지막으로, 왼쪽 조인은 그룹에 n*(n+1)/2 조인을 생성하므로 그룹의 크기에 따라 성능이 크게 영향을 받을 수 있습니다.

퍼포먼스는 보증할 수 없지만 Microsoft Excel의 제한에서 영감을 얻은 요령이 있습니다.그것은 몇 가지 좋은 특징이 있다.

좋은 물건

  • 동점(때로는 유용함)이 있더라도 "최대 기록" 하나만 강제로 반환해야 한다.
  • 가입은 필요 없습니다.

접근

약간 추악하기 때문에 rev 열의 유효한 값 범위에 대해 알고 있어야 합니다.rev 열이 소수점을 포함한 0.00과 999 사이의 숫자이지만 소수점 오른쪽에 두 자리만 있다고 가정합니다(예: 34.17이 유효한 값입니다).

여기서 중요한 것은 원하는 데이터와 함께 기본 비교 필드를 연결/패킹하는 문자열별로 하나의 합성 열을 만드는 것입니다.이 방법으로 SQL의 MAX() 집약 함수가 모든 데이터를 반환하도록 강제할 수 있습니다(단일 컬럼으로 패킹되어 있기 때문입니다).그러면 데이터를 풀어야 합니다.

위의 예에서는 SQL로 작성되어 있습니다.

SELECT id, 
       CAST(SUBSTRING(max(packed_col) FROM 2 FOR 6) AS float) as max_rev,
       SUBSTRING(max(packed_col) FROM 11) AS content_for_max_rev 
FROM  (SELECT id, 
       CAST(1000 + rev + .001 as CHAR) || '---' || CAST(content AS char) AS packed_col
       FROM yourtable
      ) 
GROUP BY id

패킹은 다음과 같이 rev 열에 rev 값에 관계없이 알려진 문자 길이의 수를 강제로 지정함으로써 시작됩니다.

  • 3.2는 1003.201이 됩니다.
  • 57은 1057.001이 됩니다.
  • 923.88은 1923.881이 됩니다.

올바르게 하면, 2개의 숫자의 문자열 비교는, 2개의 숫자의 숫자 비교와 같은 「최대」가 됩니다.서브스트링 기능을 사용하면, 원래의 수치로 간단하게 되돌릴 수 있습니다(이것은 거의 어디에서나 이용 가능합니다).

고유 식별자?네! 고유 식별자!

MySQL DB를 개발하는 가장 좋은 방법 중 하나는 AUTOINCREMENT각각을 사용하는 것입니다(출처 MySQL.com).이것에 의해, 다양한 메리트를 얻을 수 있습니다.여기서는 다루기에는 너무 많습니다.이 질문의 문제는 예에 중복된 ID가 있다는 것입니다.이는 고유 식별자의 이러한 엄청난 이점을 무시하면서 동시에 이미 이 문제에 익숙한 사람들에게는 혼란스러운 일입니다.

가장 깨끗한 솔루션

DB 바이올린

에는 MySQL이 부속되어 .ONLY_FULL_GROUP_BY디폴트로 유효하게 되어 있습니다.여기서 설명하는 솔루션의 대부분은 이 조건에서의 테스트에서 실패합니다.

해서 그냥 , 고르다, 고르다, 고르다를 하면 됩니다.DISTINCT 어떤 유니퀴필드,MAX( 분야에서는 무엇이든 간에 ),( * somethird 필 *)하는 방법을

SELECT DISTINCT t1.id, MAX(t1.rev), MAX(t2.content)
FROM Table1 AS t1
JOIN Table1 AS t2 ON t2.id = t1.id AND t2.rev = (
    SELECT MAX(rev) FROM Table1 t3 WHERE t3.id = t1.id
)
GROUP BY t1.id;
  • SELECT DISTINCT Table1.id, max(Table1.rev), max(Table2.content) : ★★★DISTINCT 썸필드,MAX() 분야, 분야, 마지막 분야MAX()합니다.1행뿐이지만 쿼리에 필수이기 때문에 용장성이 있습니다.
  • FROM Employee 테이블 검색.
  • JOIN Table1 AS Table2 ON Table2.rev = Table1.rev: max(table1.rev)의 코멘트를 취득할 필요가 있기 때문에, 첫 번째 테이블에 참가합니다.
  • GROUP BY Table1.id각되는 결과가 각 직원의 급여 행이 상위 정렬이 되도록 합니다.

OP의 질문에서 "콘텐츠"는 "..."이기 때문에 이것이 작동하는지 테스트할 방법은 없습니다.그래서 '..a', '..b'로 변경했습니다.이렇게 하면 결과가 정확하다는 것을 알 수 있습니다.

id  max(Table1.rev) max(Table2.content)
1   3   ..d
2   1   ..b

★★★★★★★★★★★★★★★★? DISTINCT(),MAX()MySQL을 사용하세요.★★★★★★★★★★★★★★★★★★★★★★★★★★또는 인덱스를 사용하여 모든 행을 확인하는 쿼리와 비교하는 것이 훨씬 빠릅니다.

오리지널 솔루션

★★★★★★★★★★★★★★★★ ONLY_FULL_GROUP_BY 할 수 .GROUP BY에서만 사용하고 ID ,, 、 、 、 여 、 여 、 여 、 여는 。

SELECT *
FROM
    (SELECT *
    FROM Employee
    ORDER BY Salary DESC)
AS employeesub
GROUP BY employeesub.Salary;
  • SELECT * 합니다.: 모든 필드를 반환합니다.
  • FROM Employee 테이블 검색.
  • (SELECT *...): Salay.subquery : Salay.subquery : .subquery : Salay.subquery : Salay.subquery 으로 정렬하여 반환합니다.
  • GROUP BY employeesub.Salary각되는 결과가 각 직원의 급여 행이 상위 정렬이 되도록 합니다.

고유 행 솔루션

관계형 데이터베이스의 정의: "테이블의 각 행에는 고유한 키가 있습니다."즉, 질문의 예에서 id는 고유해야 하며, 이 경우 다음 작업을 수행할 수 있습니다.

SELECT *
FROM Employee
WHERE Employee.id = 12345
ORDER BY Employee.Salary DESC
LIMIT 1

이 솔루션이 문제를 해결하고 모든 사람이 DB에서 무슨 일이 일어나고 있는지 더 잘 이해할 수 있도록 도와줄 수 있기를 바랍니다.

이런 거?

SELECT yourtable.id, rev, content
FROM yourtable
INNER JOIN (
    SELECT id, max(rev) as maxrev
    FROM yourtable
    GROUP BY id
) AS child ON (yourtable.id = child.id) AND (yourtable.rev = maxrev)

하나의 은 을 사용하는 입니다.MAX()OVER PARTION

SELECT t.*
  FROM
    (
    SELECT id
          ,rev
          ,contents
          ,MAX(rev) OVER (PARTITION BY id) as max_rev
      FROM YourTable
    ) t
  WHERE t.rev = t.max_rev 

다른 것은요.ROW_NUMBER()되어 있는 은 OVER PARTION이다.

SELECT t.*
  FROM
    (
    SELECT id
          ,rev
          ,contents
          ,ROW_NUMBER() OVER (PARTITION BY id ORDER BY rev DESC) rank
      FROM YourTable
    ) t
  WHERE t.rank = 1 

이 2개의 SELECT는 Oracle 10g에서 잘 작동합니다.

은 MAX()보다 확실히 됩니다.ROW_NUMBER() 방법: '왜냐하면'MAX()는 '복잡함'이다.O(n) 동시에ROW_NUMBER()O(n.log(n))서 ''는n이치

는 이렇게 쓰는 걸 좋아해요.NOT EXIST - - " " " "

SELECT 
  id, 
  rev
  -- you can select other columns here
FROM YourTable t
WHERE NOT EXISTS (
   SELECT * FROM YourTable t WHERE t.id = id AND rev > t.rev
)

그러면 그룹 내 최대값을 가진 모든 레코드가 선택되고 다른 열을 선택할 수 있습니다.

내 생각엔, 이걸?

select * from docs where (id, rev) IN (select id, max(rev) as rev from docs group by id order by id)  

SQL Fidle :여기를 체크합니다.

SELECT *
FROM Employee
where Employee.Salary in (select max(salary) from Employee group by Employe_id)
ORDER BY Employee.Salary

참고: MySQL 8일 이상에는 더 이상 권장하지 않습니다.몇 년 동안 안 써봤어요.

MySQL 고유의 세 번째 솔루션은 다음과 같습니다.

SELECT id, MAX(rev) AS rev
 , 0+SUBSTRING_INDEX(GROUP_CONCAT(numeric_content ORDER BY rev DESC), ',', 1) AS numeric_content
FROM t1
GROUP BY id

네, 보기에도 끔찍하지만(스트링이나 백으로 변환하는 등), 제 경험상으로는 보통 다른 솔루션보다 빠릅니다.단순히 사용 사례 때문일지도 모르지만, 수백만 개의 레코드와 많은 고유 ID가 있는 테이블에서 사용해 왔습니다.MySQL이 다른 솔루션을 최적화하는 데 서툴러서일 수도 있습니다(최소한 이 솔루션을 고안한 5.0일 동안).

GROUP_CONCAT에 관한 정보입니다. , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .group_concat_max_len해 주십시오.또한 행 수가 많은 경우 확장에는 제한이 있다는 점에 유의하십시오.

내용 필드가 이미 텍스트인 경우 위의 내용은 직접 작동하지 않습니다.이 경우 \0과 같은 다른 구분 기호를 사용해야 합니다.'나'나 '나'나 '나'나 '나'나 '나'나 '나'나 '나'나 '나'나 '나'나 '나'나group_concat_max_len더 빨리 제한합니다.

mySQL이 아닌 다른 사용자가 이 질문을 발견하고 SQL을 사용하는 경우 MS SQL에서 의 가장 큰 문제를 해결하는 또 다른 방법은

WITH DocIds AS (SELECT DISTINCT id FROM docs)

SELECT d2.id, d2.rev, d2.content
FROM DocIds d1
CROSS APPLY (
  SELECT Top 1 * FROM docs d
  WHERE d.id = d1.id
  ORDER BY rev DESC
) d2

다음은 SqlFiddle의 예입니다.

나는 이것을 사용한다:

select t.*
from test as t
join
   (select max(rev) as rev
    from test
    group by id) as o
on o.rev = t.rev

Subquery SELECT는 그다지 효율적이지 않을 수 있지만 JOIN 절에서는 사용할 수 있을 것 같습니다.쿼리 최적화에 대한 전문가는 아니지만 MySQL, Postgre에서 시도해 보았습니다.SQL, FireBird는 매우 잘 작동합니다.

이 스키마는 여러 조인 및 WHERE 절과 함께 사용할 수 있습니다.이것은 나의 작업 예(테이블 "firmy"에서 해결한 것과 동일한 문제 해결):

select *
from platnosci as p
join firmy as f
on p.id_rel_firmy = f.id_rel
join (select max(id_obj) as id_obj
      from firmy
      group by id_rel) as o
on o.id_obj = f.id_obj and p.od > '2014-03-01'

이것은 10대의 레코드가 있는 테이블에서 요구되며, 너무 강하지 않은 기계에서는 0.01초도 걸리지 않습니다.

IN 조항은 사용하지 않습니다(위 어디선가 언급되어 있습니다).IN은 하위 쿼리에 구축된 쿼리 필터가 아닌 짧은 콘스탄 목록과 함께 사용하도록 지정되었습니다.이는 IN의 서브쿼리가 스캔된 레코드마다 수행되기 때문에 쿼리에 시간이 오래 걸릴 수 있습니다.

이 문제에 관한 가장 일반적인 질문이기 때문에 다음 답변도 여기에 다시 게시하겠습니다.

보다 간단한 방법이 있는 것 같습니다(MySQL에서만 가능).

select *
from (select * from mytable order by id, rev desc ) x
group by id

이 질문에 대한 사용자 Bohemian의 답변은 매우 간결하고 우아한 답변입니다.

편집: 이 솔루션은 많은 사용자에게 효과가 있지만 장기적으로는 안정적이지 않을 수 있습니다. MySQL은 GROUP BY 문에 GROUP BY 목록에 없는 열에 대해 의미 있는 값이 반환되는 것을 보장하지 않기 때문입니다.따라서 이 솔루션을 사용하는 것은 고객 자신의 책임입니다.

select 문에 여러 개의 필드가 있고 최적화된 코드를 통해 이러한 모든 필드에 대해 최신 값을 원하는 경우:

select * from
(select * from table_name
order by id,rev desc) temp
group by id 

이거 어때:

SELECT all_fields.*  
FROM (SELECT id, MAX(rev) FROM yourtable GROUP BY id) AS max_recs  
LEFT OUTER JOIN yourtable AS all_fields 
ON max_recs.id = all_fields.id

이 솔루션은 YourTable에서 하나만 선택하므로 더 빠릅니다.sqlfiddle.com의 테스트에 따르면 MySQL 및 SQLite(SQLite 제거 DESC용)에서만 작동합니다.아마 제가 잘 모르는 다른 언어로 작업하도록 조정할 수 있을 것입니다.

SELECT *
FROM ( SELECT *
       FROM ( SELECT 1 as id, 1 as rev, 'content1' as content
              UNION
              SELECT 2, 1, 'content2'
              UNION
              SELECT 1, 2, 'content3'
              UNION
              SELECT 1, 3, 'content4'
            ) as YourTable
       ORDER BY id, rev DESC
   ) as YourTable
GROUP BY id

여기 그것을 하는 좋은 방법이 있다.

다음 코드 사용:

with temp as  ( 
select count(field1) as summ , field1
from table_name
group by field1 )
select * from temp where summ = (select max(summ) from temp)

나는 어떤 컬럼별로 기록을 순위를 매겨서 이것을 하는 것을 좋아한다. 랭크 「」를 설정합니다.rev「」로 idrev순위가 낮아질 거예요. 높다rev1번입니다.

select id, rev, content
from
 (select
    @rowNum := if(@prevValue = id, @rowNum+1, 1) as row_num,
    id, rev, content,
    @prevValue := id
  from
   (select id, rev, content from YOURTABLE order by id asc, rev desc) TEMP,
   (select @rowNum := 1 from DUAL) X,
   (select @prevValue := -1 from DUAL) Y) TEMP
where row_num = 1;

변수를 도입하면 모든 것이 느려질지 확실하지 않다.하지만 적어도 난 이 모든 걸 물어보는 게 아니야YOURTABLE

rev 필드를 역순으로 정렬한 다음 각 그룹의 첫 번째 행(rev 값이 가장 높은 행)을 제공하는 ID별로 그룹화했습니다.

SELECT * FROM (SELECT * FROM table1 ORDER BY id, rev DESC) X GROUP BY X.id;

http://sqlfiddle.com/에서 다음 데이터를 사용하여 테스트 완료

CREATE TABLE table1
    (`id` int, `rev` int, `content` varchar(11));

INSERT INTO table1
    (`id`, `rev`, `content`)
VALUES
    (1, 1, 'One-One'),
    (1, 2, 'One-Two'),
    (2, 1, 'Two-One'),
    (2, 2, 'Two-Two'),
    (3, 2, 'Three-Two'),
    (3, 1, 'Three-One'),
    (3, 3, 'Three-Three')
;

MySql 5.5 및 5.6에서 다음과 같은 결과를 얻었습니다.

id  rev content
1   2   One-Two
2   2   Two-Two
3   3   Three-Two

도움이 되기를 바라는 또 다른 해결책이 있다.

Select a.id , a.rev, a.content from Table1 a
inner join 
(SELECT id, max(rev) rev FROM Table1 GROUP BY id) x on x.id =a.id and x.rev =a.rev

이 대답들 중 어느 것도 나에게는 통하지 않았다.

이게 나한테 효과가 있었어.

with score as (select max(score_up) from history)
select history.* from score, history where history.score_up = score.max

다음은 해당 필드의 최대값을 가진 필드로만 레코드를 가져오는 다른 솔루션입니다.이 기능은 현재 작업 중인 플랫폼인 SQL400에서 작동합니다.이 예에서는 필드 5의 최대값을 가진 레코드는 다음 SQL 문에 의해 취득됩니다.

SELECT A.KEYFIELD1, A.KEYFIELD2, A.FIELD3, A.FIELD4, A.FIELD5
  FROM MYFILE A
 WHERE RRN(A) IN
   (SELECT RRN(B) 
      FROM MYFILE B
     WHERE B.KEYFIELD1 = A.KEYFIELD1 AND B.KEYFIELD2 = A.KEYFIELD2
     ORDER BY B.FIELD5 DESC
     FETCH FIRST ROW ONLY)

없이 할 수 .rev ★★★★★★★★★★★★★★★★★」idmaxRevIdMAX()원래 값으로 다시 분할합니다.

SELECT maxRevId & ((1 << 32) - 1) as id, maxRevId >> 32 AS rev
FROM (SELECT MAX(((rev << 32) | id)) AS maxRevId
      FROM YourTable
      GROUP BY id) x;

이것은 단일 테이블이 아닌 복잡한 조인(join)이 있는 경우 특히 빠릅니다.기존 접근 방식으로는 복잡한 결합이 두 번 수행됩니다.

은 비트 .rev ★★★★★★★★★★★★★★★★★」idINT UNSIGNED및 (32비트)에 값BIGINT UNSIGNED(64년) 언제?id&rev열로 되어 있습니다.를 들어, 32비트보다 큰 값을 해야 합니다.예를 들어, 이 값을 2진수 값으로 조합할 필요가 있습니다.MAX().

설명.

이것은 순수한 SQL이 아닙니다.SQL Chemy ORM을 사용합니다.

SQL Chemy를 찾으러 왔기 때문에 Adrian Carneiro의 답변을 python/SQ로 복제합니다.LAlchemy 버전, 특히 외부 결합 부분.

이 쿼리는 다음 질문에 답변합니다.

버전 번호가 가장 높은 레코드 그룹(동일 ID 기준)의 레코드를 반환할 수 있습니까?

이것에 의해, 레코드의 복제, 갱신, 버전 번호의 증가, 및 시간의 경과에 따른 변경을 표시할 수 있는 방법으로 낡은 버전의 카피를 취득할 수 있습니다.

코드

MyTableAlias = aliased(MyTable)
newest_records = appdb.session.query(MyTable).select_from(join(
    MyTable, 
    MyTableAlias, 
    onclause=and_(
        MyTable.id == MyTableAlias.id,
        MyTable.version_int < MyTableAlias.version_int
    ),
    isouter=True
    )
).filter(
    MyTableAlias.id  == None,
).all()

포스트그리에서 테스트 완료SQL 데이터베이스

저는 아래를 사용하여 문제를 해결했습니다.먼저 임시 테이블을 만들고 고유 ID당 최대 rev 값을 삽입합니다.

CREATE TABLE #temp1
(
    id varchar(20)
    , rev int
)
INSERT INTO #temp1
SELECT a.id, MAX(a.rev) as rev
FROM 
    (
        SELECT id, content, SUM(rev) as rev
        FROM YourTable
        GROUP BY id, content
    ) as a 
GROUP BY a.id
ORDER BY a.id

다음으로 이러한 최대값(#temp1)을 가능한 모든 id/콘텐츠 조합에 결합했습니다.이것에 의해, 최대가 아닌 id/콘텐츠의 편성을 자연스럽게 필터링 할 수 있게 되어, 각각의 최대 rev값만이 남습니다.

SELECT a.id, a.rev, content
FROM #temp1 as a
LEFT JOIN
    (
        SELECT id, content, SUM(rev) as rev
        FROM YourTable
        GROUP BY id, content
    ) as b on a.id = b.id and a.rev = b.rev
GROUP BY a.id, a.rev, b.content
ORDER BY a.id

언급URL : https://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on-a-column

반응형