programing

ORDER BY와 GROUP BY를 함께 사용

randomtip 2022. 9. 12. 11:30
반응형

ORDER BY와 GROUP BY를 함께 사용

내 테이블은 다음과 같습니다(MySQL을 사용하고 있습니다).

m_id | v_id | timestamp
------------------------
6    |   1  | 1333635317
34   |   1  | 1333635323
34   |   1  | 1333635336
6    |   1  | 1333635343
6    |   1  | 1333635349

나의 목표는 각 m_id를 한 번 찍고 가장 높은 타임스탬프로 주문하는 것입니다.

결과는 다음과 같습니다.

m_id | v_id | timestamp
------------------------
6    |   1  | 1333635349
34   |   1  | 1333635336

그리고 나는 다음과 같은 질문을 썼다.

SELECT * FROM table GROUP BY m_id ORDER BY timestamp DESC

그러나 결과는 다음과 같습니다.

m_id | v_id | timestamp
------------------------
34   |   1  | 1333635323
6    |   1  | 1333635317

GROUP_BY를 먼저 하고 결과를 주문하기 때문에 그런 것 같습니다.

좋은 생각 있어요?감사합니다.

이 작업을 수행하는 한 가지 방법은 다음과 같습니다.group by:

select l.* 
from table l
inner join (
  select 
    m_id, max(timestamp) as latest 
  from table 
  group by m_id
) r
  on l.timestamp = r.latest and l.m_id = r.m_id
order by timestamp desc

동작 구조:

  • 각 구별되는 최신 타임스탬프를 선택합니다.m_id서브쿼리에서
  • 행만 선택table서브쿼리의 행과 일치한다(이 작업은 조인이 수행되지만 두 번째 테이블에서 열이 선택되지 않고 필터로만 사용됨)는 궁금할 경우 "세미조인"으로 알려져 있습니다).
  • 행의 순서를 정하다

어떤 타임 스탬프를 얻을지 정말 신경쓰지 않는다면v_id항상 똑같다m_i다음 작업을 수행할 수 있습니다.

select m_id, v_id, max(timestamp) from table
group by m_id, v_id
order by max(timestamp) desc

이제, 만약v_id일정한 변화m_id그러면 다음 작업을 수행해야 합니다.

select t1.* from table t1
left join table t2 on t1.m_id = t2.m_id and t1.timestamp < t2.timestamp
where t2.timestamp is null
order by t1.timestamp desc

여기 가장 간단한 해결책이 있습니다.

select m_id,v_id,max(timestamp) from table group by m_id;

m_id 단위로 그룹화하지만 각 m_id에 대한 최대 타임스탬프를 가져옵니다.

이거 드셔보세요

 SELECT tbl.* FROM (SELECT * FROM table ORDER BY timestamp DESC) as tbl
 GROUP BY tbl.m_id  

SQL >

SELECT interview.qtrcode QTR, interview.companyname "Company Name", interview.division Division 
FROM interview 
JOIN jobsdev.employer 
    ON (interview.companyname = employer.companyname AND employer.zipcode like '100%')
GROUP BY interview.qtrcode, interview.companyname, interview.division
ORDER BY interview.qtrcode;

처음에는 질문과 답변을 이해하려고 할 때 혼란스러웠어요.저는 책을 읽으면서 시간을 보냈는데 요약해서 말하고 싶습니다.

  1. OP의 예는 약간 오해의 소지가 있다.처음에 나는 왜 받아들여진 답이 받아들여진 답인지 이해할 수 없었다.OP의 요청은 간단히 충족될 수 있다고 생각했다.
select m_id, v_id, max(timestamp) as max_time from table
group by m_id, v_id
order by max_time desc

그리고 나서 나는 받아들여진 답을 다시 한 번 살펴보았다.실제로 OP는 다음과 같은 샘플 표를 표현하고 싶어한다는 것을 알게 되었습니다.

m_id | v_id | timestamp
------------------------
6    |   1  | 11
34   |   2  | 12
34   |   3  | 13
6    |   4  | 14
6    |   5  | 15

모든 컬럼선택하려고 합니다.group by)m_id및 (order by)timestamp.

그러면 위의 sql이 작동하지 않습니다.그래도 이해되지 않으면 다음보다 더 많은 열이 있다고 가정해 보십시오. m_id | v_id | timestamp,예m_id | v_id | timestamp| columnA | columnB |column C| ....와 함께group by, 이러한 「그룹화 기준」열만 선택해, 결과내의 함수를 집약할 수 있습니다.

지금까지 인정된 답을 이해했어야 했다.게다가 체크해 주세요.row_numberMySQL 8.0에서 도입된 기능:

https://www.mysqltutorial.org/mysql-window-functions/mysql-row_number-function/

  1. 모든 그룹의 상위 N개 행 찾기

그것은 일반적으로 받아들여지는 대답으로서 더 큰 역할을 한다.

  1. 틀린 답도 있다.MySQL에서 오류가 발생.
select m_id,v_id,max(timestamp) from table group by m_id;

@abinash sahoo

SELECT m_id,v_id,MAX(TIMESTAMP) AS TIME
 FROM table_name 
 GROUP BY m_id

@Vikas Garhwal

오류 메시지:

[42000][1055] Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'testdb.test_table.v_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

왜 그렇게 복잡하게 만들죠?이거 성공했어.

SELECT m_id,v_id,MAX(TIMESTAMP) AS TIME
 FROM table_name 
 GROUP BY m_id

그냥 ASC로 설명하면 돼.다음과 같이 쿼리를 작성하십시오.값이 오름차순으로 반환됩니다.

SELECT * FROM table GROUP BY m_id ORDER BY m_id asc;

언급URL : https://stackoverflow.com/questions/10030787/using-order-by-and-group-by-together

반응형