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;
처음에는 질문과 답변을 이해하려고 할 때 혼란스러웠어요.저는 책을 읽으면서 시간을 보냈는데 요약해서 말하고 싶습니다.
- 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_number
MySQL 8.0에서 도입된 기능:
https://www.mysqltutorial.org/mysql-window-functions/mysql-row_number-function/
- 모든 그룹의 상위 N개 행 찾기
그것은 일반적으로 받아들여지는 대답으로서 더 큰 역할을 한다.
- 틀린 답도 있다.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
'programing' 카테고리의 다른 글
Java HTTPS 클라이언트 증명서 인증 (0) | 2022.09.13 |
---|---|
XAMPP에서 phpMyAdmin을 사용하여 "구성에서 정의된 controluser에 대한 연결에 실패했습니다." (0) | 2022.09.12 |
ReactJS를 사용하여 입력 필드의 값을 얻는 방법은 무엇입니까? (0) | 2022.09.12 |
1개의 쿼리로 여러 개의 문을 노드 검출 (0) | 2022.09.12 |
데이터베이스의 관점에서 REFRESH와 MERGE는 무엇을 의미합니까? (0) | 2022.09.12 |