programing

MariaDB/MySQL RANK() 구현

kingscode 2022. 9. 8. 22:56
반응형

MariaDB/MySQL RANK() 구현

저는 MS SQL Server에서 MariaDB 10.0으로의 이행 작업을 하고 있습니다.RANK() Partition BY를 사용하는 질문이 있습니다.이미 테이블에 RANK() 실장을 작성했는데 제대로 작동하지 않습니다.

최초 쿼리는 다음과 같습니다.

RANK() OVER (PARTITION BY visits.id_partner ORDER BY visits.updated_at DESC) AS rank

MariaDB/MySQL 구현:

SELECT
    ...,
    (
        CASE visits.id_partner
            WHEN @currId THEN
                @curRow := @curRow + 1
            ELSE
                @curRow := 1 AND @currId := visits.id_partner
        END
    ) AS rank
FROM
    records rec
    JOIN visits ON visits.id = rec.id_visit,
    (
        SELECT
        @curRank := 0,
        @currId := NULL
    ) r
WHERE
    ...
ORDER BY visits.id_partner ASC, visits.updated_at DESC

id_partner order별로 updated_at 필드별로 순위가 매겨진 행을 선택하고 싶습니다.id_partner가 행과 동일한 경우 RANK가 1씩 증가해야 합니다.이전과 다를 경우 1로 리셋해야 합니다.

하지만 제 질문은 전혀 효과가 없습니다.나는 여전히 모든 줄에서 1위를 차지하고 있다.실수 찾는 것 좀 도와줄래?

도와주셔서 감사합니다!

MySQL/MariaDB에서 변수를 사용하는 것은 어렵습니다.변수는 하나의 문에서만 사용하고 할당해야 합니다(올바른 대로).하지만,ANDcan short-circuit 변수 할당.

저는 이런 구조를 사용해서ROW_NUMBER().RANK()사실 좀 괴로운...DENSE_RANK()그리고.ROW_NUMBER()더 심플합니다.단, 이것이 당신이 목표로 하는 코드인 것 같습니다.

SELECT ...,
       (@rn := if(@currId = visits.id_partner, @rn + 1,
                  if(@currId := visits.id_partner, 1, 1)
                 )
       ) as rank
FROM records rec JOIN
     visits
     ON visits.id = rec.id_visit CROSS JOIN
     (SELECT @rn := 0, @currId := NULL) params
WHERE
    ...
ORDER BY visits.id_partner ASC, visits.updated_at DESC;

편집:

MySQL(아마도 MariaDB)에서는 서브쿼리를 사용하지 않으면 변수가 제대로 작동하지 않을 수 있습니다.자, 이걸 써보세요.

SELECT . . .,
       (@rn := if(@currId = visits.id_partner, @rn + 1,
                  if(@currId := visits.id_partner, 1, 1)
                 )
       ) as rank
FROM (SELECT ...
      FROM records rec JOIN
           visits
           ON visits.id = rec.id_visit 
      WHERE
          ...
      ORDER BY visits.id_partner ASC, visits.updated_at DESC
     ) t CROSS JOIN
     (SELECT @rn := 0, @currId := NULL) params;

언급URL : https://stackoverflow.com/questions/33435162/mariadb-mysql-rank-implementation

반응형