programing

한 열의 값이 서로 다른 가장 최근의 레코드 3개를 선택합니다.

newsource 2023. 10. 2. 15:04

한 열의 값이 서로 다른 가장 최근의 레코드 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개의 레코드(타임 디스크 기준)를 선택하는 것입니다.otheridentifiers는 구별됩니다그래서 이 경우 결과는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