반응형
그룹별 값 목록에서 n번째 값을 쿼리하려면 어떻게 해야 합니까?MySQL
다음과 같은 테이블이 있습니다.
| thread_id | time |
| --------- | ---------- |
| 769 | 1566880174 |
| 769 | 1566880415 |
| 769 | 1566884409 |
| 769 | 1566891158 |
| 769 | 1567215554 |
| 769 | 1567227195 |
| 769 | 1567822758 |
| 773 | 1566973984 |
| 773 | 1567216614 |
| 773 | 1567216833 |
| 773 | 1567216913 |
| 773 | 1567216992 |
| 773 | 1567298692 |
| 774 | 1566977378 |
| 774 | 1567218446 |
| 774 | 1567228282 |
| 774 | 1568241410 |
| 784 | 1567300468 |
| 785 | 1567300549 |
| 785 | 1567310667 |
| 785 | 1567310734 |
| 785 | 1567461936 |
thread_id별로 그룹화된n번째 값을 취득해야 합니다.thread_id마다 두 번째 행을 찾는 경우 출력은 다음과 같습니다.
| thread_id | time |
| --------- | ---------- |
| 769 | 1566880415 |
| 773 | 1567216614 |
| 774 | 1567218446 |
| 784 | null |
| 785 | 1567310667 |
어떻게 하면 이 결과를 얻을 수 있을까요?
SELECT NTH_VALUE(thread_id, 2) OVER (
PARTITION BY thread_id
ORDER BY thread_id DESC
) second, time
FROM table_name;
이와 비슷해야 합니다. 작동하지 않으면 출력을 보여 줍니다.
MySQL 8.0을 사용하지 않는 경우 다음과 같이 수행할 수 있습니다(@Barmar에서 제안).
SELECT thread_id,
CASE WHEN COUNT(*) >=2
THEN SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(TIME ORDER BY TIME) ,',',2),',',-1)
ELSE NULL END AS TIME
FROM TableA GROUP BY thread_id;
행 번호를 사용하여 아래 옵션을 시도할 수 있습니다.
SELECT B.thread_id,C.Time
FROM (
SELECT DISTINCT thread_id FROM your_table A
)B
LEFT JOIN (
SELECT *,
@row_num :=IF(@prev_value = concat_ws('',thread_id),@row_num+1,1)AS RowNumber
, @prev_value := concat_ws('',thread_id) AS Temp
FROM your_table A,
(SELECT @row_num := 0) r
ORDER BY thread_id,`time`
)C ON B.thread_id = C.thread_id AND C.RowNumber = 2;
보다 심플한 솔루션은 다음과 같습니다.
[추정:time
다음 순서로 주문되지 않았습니다.thread_id
파티션]
select distinct thread_id, lead(2, time) over (partition by thread_id rows between unbounded preceding and unbounded following) as time
from table_name
그러면 각각에 대한 파티션이 생성됩니다.thread_id
두 번째 값을 동일한 값을 공유하는 다른 모든 행에 할당합니다.thread_id
필요한 건...distinct
모든 중복을 제거합니다.
저도 비슷한 상황이지만 데이터를 바탕으로 n번째 값을 찾아야 합니다.가지고 있는 데이터는 다음과 같습니다.
----------------
|id |name|score|
----------------
|1 |A |89 |
|2 |B |98 |
|3 |C |88 |
|4 |D |89 |
|5 |E |92 |
|6 |F |90 |
|7 |G |88 |
|8 |H |91 |
|9 |I |90 |
----------------
4등 학생부 검색은 필수입니다.다음 쿼리를 사용하여 점수에 따라 데이터를 가져옵니다.
select student.id, student.name, student.score
from (select score from student group by score order by score desc limit 3,1) student_temp, student
where student_temp.score = student.score
order by student_temp.score desc ;
이 SQL을 기반으로 결과를 얻었습니다.
----------------
|id |name|score|
----------------
|6 |F |90 |
|9 |I |90 |
----------------
SQL 작성에 대한 기본적인 지식이 있습니다.개선사항이나 제안이 있으면 코멘트 부탁드립니다.
언급URL : https://stackoverflow.com/questions/57920750/how-do-you-query-the-nth-value-from-a-list-of-values-by-group-mysql
반응형
'programing' 카테고리의 다른 글
Larabel 5.1 - 데이터베이스 연결 확인 (0) | 2023.01.19 |
---|---|
구가 예상대로 작동하지 않는 경우:하나의 ID만 지정되면 두 개의 다른 ID에서 데이터를 가져옵니다. (0) | 2023.01.19 |
mysql, percona, maria 중 어느 것을 결정하다DB (0) | 2023.01.19 |
LEFT JOIN을 사용하여 MySQL의 여러 테이블 업데이트 (0) | 2023.01.19 |
Axios 처리 오류 (0) | 2023.01.19 |