[SQL] MySQL의 5.6 - 주문이없는 기능 같은 DENSE_RANK
SQLMySQL의 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.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.당신은 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.기본적으로, 당신은 변형을 열거합니다. 당신은 그냥 숫자를 원하는 경우에, 당신은 최소한의 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은 변수 할당이 정렬 전에 발생을 보증하지 않습니다.
from https://stackoverflow.com/questions/52352877/mysql-5-6-dense-rank-like-functionality-without-order-by by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] ColdFusion에서 질의 - 사출 보호 (0) | 2020.07.18 |
---|---|
[SQL] 세 번째 테이블에서 FK 제약 조건의 위반을 방지하기 위해 제약 (0) | 2020.07.18 |
[SQL] PostgreSQL의에서 테이블을 피벗 해제하는 방법 (0) | 2020.07.18 |
[SQL] 트리거 생성 오류 : 유효하지 않은 구문을 (0) | 2020.07.18 |
[SQL] VBA를 사용하여 Excel 통합 문서에서 쿼리를 삭제 (0) | 2020.07.18 |