복붙노트

[SQL] MySQL의 5.6 - 주문이없는 기능 같은 DENSE_RANK

SQL

MySQL의 5.6 - 주문이없는 기능 같은 DENSE_RANK

나는이 같은 테이블이 있습니다 :

+------+-----------+
|caseID|groupVarian|
+------+-----------+
|1     |A,B,C,D,E  |
+------+-----------+
|2     |A,B,N,O,P  |
+------+-----------+
|3     |A,B,N,O,P  |
+------+-----------+
|4     |A,B,C,D,F  |
+------+-----------+
|5     |A,B,C,D,E  |
+------+-----------+

(: V1, V2 등 예) I 새로운 동일한 groupVarian 값이 nameVarian로 표현 순위 같은이되도록 열 nameVarian을 좀하고 싶습니다. 그러나, 특정의 groupVarian 할당 nameVarian caseID 값의 순서에 따라이어야한다 (순서들은 테이블 안에 표시).

출력은 뭔가를해야한다 :

+------+-----------+----------+
|caseID|groupVarian|namevarian
+------+-----------+----------+
|1     |A,B,C,D,E  |v1        |
+------+-----------+----------+
|2     |A,B,N,O,P  |v2        |
+------+-----------+----------+
|3     |A,B,N,O,P  |v2        |
+------+-----------+----------+
|4     |A,B,C,D,F  |v3        |
+------+-----------+----------+
|5     |A,B,C,D,E  |v1        |
+------+-----------+----------+

해결법

  1. ==============================

    1.MySQL 버전 <8.0 (OP의 버전은 5.6입니다) :

    MySQL 버전 <8.0 (OP의 버전은 5.6입니다) :

    groupVarian 이상 DENSE_RANK 기능을 필요로하는 등의 문제 문 모양; 그러나 그렇지 않다. 으로는 @Gordon Linoff에 의해 설명 :

    테이블 이름은 t이 (그에 따라 코드 테이블과 필드 이름 (들)을 변경하십시오)라고 가정. 여기에 원하는 결과 (DB 바이올린을)주고, (MySQL의 이전 버전에 대한) 세션 변수를 이용하는 방법은 다음과 같습니다

    SET @row_number = 0;
    SELECT t3.caseID, 
           t3.groupVarian, 
           CONCAT('v', t2.num) AS nameVarian
    FROM
      (
       SELECT 
         (@row_number:=@row_number + 1) AS num, 
         t1.groupVarian 
       FROM 
         (
          SELECT DISTINCT groupVarian 
          FROM t 
          ORDER BY caseID ASC 
         ) AS t1 
      ) AS t2 
    INNER JOIN t AS t3 
      ON t3.groupVarian = t2.groupVarian 
    ORDER BY t3.caseID ASC 
    

    또한 : 에뮬레이션 DENSE_RANK 기능에 내 이전 시도는 잘 작동합니다. 이전 쿼리도 불통 할 수 있지만 약간 DENSE_RANK 기능을 달성했다. 이 작은 파생 테이블을 생성하고,을 피가 groupVarian을 가입하지만, 다음 쿼리는, 더 효율적입니다 :

    SET @row_number = 1;
    SET @group_varian = '';
    
    SELECT inner_nest.caseID, 
           inner_nest.groupVarian, 
           CONCAT('v', inner_nest.num) as nameVarian 
    FROM (
            SELECT 
                caseID, 
                @row_number:=CASE
                               WHEN @group_varian = groupVarian THEN @row_number
                               ELSE @row_number + 1
                             END AS num, 
                @group_varian:=groupVarian as groupVarian 
            FROM
                t  
            ORDER BY groupVarian
         ) AS inner_nest 
    ORDER BY inner_nest.caseID ASC 
    
  2. ==============================

    2.당신은 DENSE_RANK (MySQL은 8.0)을 사용할 수 있습니다 :

    당신은 DENSE_RANK (MySQL은 8.0)을 사용할 수 있습니다 :

    SELECT *, CONCAT('v', DENSE_RANK() OVER(ORDER BY groupVarian)) AS namevarian
    FROM tab
    ORDER BY CaseID;
    

    DB <> 바이올린 데모

  3. ==============================

    3.기본적으로, 당신은 변형을 열거합니다. 당신은 그냥 숫자를 원하는 경우에, 당신은 최소한의 ID를 사용할 수 있습니다 :

    기본적으로, 당신은 변형을 열거합니다. 당신은 그냥 숫자를 원하는 경우에, 당신은 최소한의 ID를 사용할 수 있습니다 :

    select t.*, min_codeId as groupVariantId
    from t join
         (select groupVariant, min(codeId) as min_codeId
          from t
          group by groupVariant
         ) g
         on t.groupVariant = g.groupVariant;
    

    하지만 당신이 원하는 것을 확실히 아니다. 당신은 그들이 데이터에 나타나는 순서로 열거 할 것으로 보인다. 이를 위해, 당신은 변수를해야합니다. 이것은 조금 까다 롭습니다하지만 :

    select t.*, rn as groupVariantId
    from t join
         (select g.*,
                 (@rn := if(@gv = groupvariant, @gv,
                            if(@gv := groupvariant, @gv+1, @gv+1)
                           )
                 ) as rn
          from (select groupVariant, min(codeId) as min_codeId
                from t
                group by groupVariant
                order by min(codeId)
               ) g cross join
               (select @gv := '', @rn := 0) params
         ) g
         on t.groupVariant = g.groupVariant;
    

    변수를 사용하는 것은 까다 롭습니다. 한 가지 중요한 고려 사항 : MySQL은은 SELECT 표현식의 평가 순서를 보장하지 않습니다. 가 잘못된 순서로 평가 될 수 있기 때문에 (다른 답변이 실수를 가지고) - 변수가 다른에서 사용 후 하나의 표현에 할당되어서는 안된다는 것을 의미한다.

    또한, 필요에 의해 순서가 하위 쿼리에서 일어날 수 있습니다. MySQL은 변수 할당이 정렬 전에 발생을 보증하지 않습니다.

  4. from https://stackoverflow.com/questions/52352877/mysql-5-6-dense-rank-like-functionality-without-order-by by cc-by-sa and MIT license