각 그룹의 최대 값 선택


87
Name    Value   AnotherColumn
-----------
Pump 1  8000.0  Something1
Pump 1  10000.0 Something2
Pump 1  10000.0 Something3
Pump 2  3043    Something4
Pump 2  4594    Something5
Pump 2  6165    Something6

내 테이블은 다음과 같습니다. 각 펌프의 최대 값을 선택하는 방법을 알고 싶습니다.

select a.name, value from out_pumptable as a,
(select name, max(value) as value from out_pumptable where group by posnumber)g where and g.value = value

이 코드는 작업을 수행하지만 동일한 값을 가진 두 개의 항목이 있으므로 Pump 1의 두 항목을 얻습니다.

답변:


182
select name, max(value)
from out_pumptable
group by name

39
그러나 이것은 Postgres 또는 strict를 사용하는 다른 RDBMS에서는 작동하지 않습니다 GROUP BY. 엄격하게 GROUP BY귀하의 모든 열은 귀하에 SELECT나타나 GROUP BY거나 집계 함수에 사용되어야합니다.
NickAb

4
권리. 이 컨텍스트에서 "Works in MySQL"은 기본적으로 충돌이 발생하지 않고 반드시 올바른 결과를 반환한다는 의미가 아닙니다.
Craig

2
@Craig가 잘못되었습니다.이 쿼리는 rdbms의 모든 종류에서 작동하며 OP가 그룹당 최대 값으로 전체 레코드를 반환 한 후가 아니라 펌프 당 최대 값을 원했기 때문에 예상대로 데이터를 반환합니다. 선택 목록에는 이름과 값의 두 필드가 있습니다. 이름은 group by 절에 있으며 값은 max를 통해 집계됩니다. 선택 목록에 더 많은 필드가 있었을 때 답변의 버전을 볼 수 없습니다.
Shadow

3
@Craig 기본 동작 아닙니다. 거의 3 년 전에 v5.7.5에서 변경되었습니다. 그러나 다시 한 번, 요점을 놓쳤습니다. 이 답변의 코드는 SQL 표준을 준수하므로 설정에 의한 mysql의 그룹은 관련이 없습니다.
Shadow

13
@NickAb 내가 뭔가를 놓치고 있습니까? 모든 열 group by 또는 집계 함수에 있습니다
Rob

17
SELECT
  b.name,
  MAX(b.value) as MaxValue,
  MAX(b.Anothercolumn) as AnotherColumn
FROM out_pumptabl
INNER JOIN (SELECT 
              name,
              MAX(value) as MaxValue
            FROM out_pumptabl
            GROUP BY Name) a ON 
  a.name = b.name AND a.maxValue = b.value
GROUP BY b.Name

기본 키가 있으면 훨씬 쉬울 것입니다. 다음은 예입니다.

SELECT * FROM out_pumptabl c
WHERE PK in 
    (SELECT
      MAX(PK) as MaxPK
    FROM out_pumptabl b
    INNER JOIN (SELECT 
                  name,
                  MAX(value) as MaxValue
                FROM out_pumptabl
                GROUP BY Name) a ON 
      a.name = b.name AND a.maxValue = b.value) 

아, 댕. 예제를 너무 간단하게 만들었습니다. 테이블에 더 많은 열이있어서 조금 복잡해집니다.>. <
Wai Wong

프로그래머 더 많은 열은 선택에 추가하는 경우
m.edmondson

기둥에 대해 자세히 설명해 주시겠습니까? 무엇을 그룹화하려고합니까?
John Hartsock

@Wai Wrong 다른 열을 추가 한 것을 알지만이 열로 무엇을하고 싶은지 설명해야합니까? 해당 열에서 값을 반환 하시겠습니까? 이름 및 SomeOtherColumn으로 그룹화 하시겠습니까?
John Hartsock

다른 열을 추가했습니다. 다른 열의 최대 값 행에있는 값과 함께 각 펌프의 최대 값을 가져오고 싶습니다. 너무 헷갈 리나요?
Wai Wong

16
select name, value 
from( select name, value, ROW_NUMBER() OVER(PARTITION BY name ORDER BY value desc) as rn
from out_pumptable ) as a
where rn = 1

이것은 내 경우에 작동하는 유일한 예입니다. '등록'당 여러 값이 있습니다. 내가 필요로하는 것은 각 등록에 대한 마지막 값이며 외부는 결합 된 채로 남아 있습니다. 에 의해 정렬 된 id DESC상의 PARTITION와이 쿼리를 포장 LEFT OUTER JOIN as grades ON grades.enrollment_id = enrollment.id하고 완벽하게 작동합니다.
lucasarruda

3
select Name, Value, AnotherColumn
from out_pumptable
where Value =
(
  select Max(Value)
  from out_pumptable as f where f.Name=out_pumptable.Name
)
group by Name, Value, AnotherColumn

이렇게 해보세요, 작동합니다.


1
select * from (select * from table order by value desc limit 999999999) v group by v.name


-3
SELECT DISTINCT (t1.ProdId), t1.Quantity FROM Dummy t1 INNER JOIN
       (SELECT ProdId, MAX(Quantity) as MaxQuantity FROM Dummy GROUP BY ProdId) t2
    ON t1.ProdId = t2.ProdId
   AND t1.Quantity = t2.MaxQuantity
 ORDER BY t1.ProdId

이것은 당신에게 아이디어를 줄 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.