한 열의 값이 서로 다른 가장 최근의 레코드 3개를 선택합니다.
저는 다음 표를 가지고 있습니다.
id time text otheridentifier
-------------------------------------------
1 6 apple 4
2 7 orange 4
3 8 banana 3
4 9 pear 3
5 10 grape 2
제가 하고 싶은 것은 가장 최근의 3개의 레코드(타임 디스크 기준)를 선택하는 것입니다.otheridentifier
s는 구별됩니다그래서 이 경우 결과는id
의: 5, 4, 2.
id
= 3은 더 최근에 같은 기록이 있기 때문에 건너뛸 것입니다.otheridentifier
들판.
제가 시도한 것은 다음과 같습니다.
SELECT * FROM `table` GROUP BY (`otheridentifier`) ORDER BY `time` DESC LIMIT 3
하지만, 저는 결국 여러 줄의id
= 역시 5, 4, 2가 아니라 5, 3, 1.
이 쿼리가 왜 내가 기대했던 것을 반환하지 않는지 누가 말해 줄 수 있습니까?ORDER BY를 ASC로 변경하려고 했지만, 이것은 단순히 반환된 행을 1, 3, 5로 재배열하는 것입니다.
SQL 문의 절 위치에 반영된 것처럼 그룹화는 주문 전에 이루어지기 때문에 원하는 것을 반환하지 않습니다.불행하게도 당신이 원하는 줄을 얻기 위해서는 더 멋진 모습을 보여야 할 것입니다.시도해 보기:
SELECT *
FROM `table`
WHERE `id` = (
SELECT `id`
FROM `table` as `alt`
WHERE `alt`.`otheridentifier` = `table`.`otheridentifier`
ORDER BY `time` DESC
LIMIT 1
)
ORDER BY `time` DESC
LIMIT 3
테이블 자체에 참여하여 마지막 항목을 필터링할 수 있습니다.otheridentifier
, 그리고 그 다음에 세 줄의 맨 위를 차지합니다.
SELECT last.*
FROM `table` last
LEFT JOIN `table` prev
ON prev.`otheridentifier` = last.`otheridentifier`
AND prev.`time` < last.`time`
WHERE prev.`id` is null
ORDER BY last.`time` DESC
LIMIT 3
저도 비슷한 요건을 가지고 있었지만, 선발 기준이 좀 더 고급이었습니다.다른 답변들을 사용해 필요한 것을 정확하게 얻을 수는 없었지만, 다음과 같은 방식으로 그룹 작업을 할 수 있다는 것을 알게 되었습니다.
SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t
GROUP BY t.otheridentifier
SELECT * FROM table t1
WHERE t1.time =
(SELECT MAX(time) FROM table t2
WHERE t2.otheridentifier = t1.otheridentifier)
안도마르의 대답은 아마도 서브쿼리를 사용하지 않는다는 점에서 가장 좋을 것입니다.
대안적 접근방식:
select *
from `table` t1
where t1.`time` in (
select max(s2.`time`)
from `table` t2
group by t2.otheridentifier
)
이 쿼리를 사용하면 정답을 알 수 있습니다.
SELECT * FROM
(SELECT * FROM `table` order by time DESC)
t group by otheridentifier
어때
SELECT *, max(time) FROM `table` group by otheridentifier
이 항목은 다음과 같습니다.
SELECT * FROM
OrigTable T INNER JOIN
(
SELECT otheridentifier,max(time) AS duration
FROM T
GROUP BY otheridentifier) S
ON S.duration = T.time AND S.otheridentifier = T.otheridentifier.
언급URL : https://stackoverflow.com/questions/924494/select-the-3-most-recent-records-where-the-values-of-one-column-are-distinct
'programing' 카테고리의 다른 글
포인터를 argv로 포인터 표시 (0) | 2023.10.02 |
---|---|
Angular 6에서 암호 유효성 확인 (0) | 2023.10.02 |
jQuery 하이라이트 테이블 행 (0) | 2023.10.02 |
스프링 보안에서 CSS 또는 JS 리소스를 로드할 수 없음 (0) | 2023.10.02 |
부트스트랩 3.0 팝오버 및 툴팁 (0) | 2023.10.02 |