2012-06-13 2 views
0

일련 번호가있는 테이블에서 각 반복 그룹의 각 멤버를 장식하고 싶습니다. 그래서 위해 :반복 그룹의 각 멤버를 순차 번호로 장식하는 SQL

id fk scheme code 
1  23 2   1234 
2  23 2   6666 
3  23 2   9876 
4  24 2   3421 
5  24 5   erty 
6  24 7   wert 
7  25 2   3490 
8  25 2   2389 
9  25 5   erfg 

나는 체계와 결합 그래서 FK

23|2|1 1234 
23|2|2 6666 
23|2|3 9876 
24|2|1 3421 
24|5|1 erty 
24|7|1 wert 
25|2|1 3490 
25|2|2 2389 
25|5|1 erfg 

가 반복 그룹을 만들어 내 결과에서 볼 것입니다. 반복 그룹에서 최대 5 개까지만 사용할 수 있지만 테스트 쿼리에서는 3 개만 허용됩니다. 순차적 행 번호는 데코 레이션으로 사용되지 않으며 캐시 조회에 사용되므로 1 또는 2 또는 3이어야합니다. 여기

내가 H2 DB SQL 구문을 사용하여 함께 제공되는 SQL이다 :

SELECT "identifier", "code" FROM (
SELECT CASE WHEN s1."code" IS NOT NULL AND s2."code" IS NULL AND s3."code" IS NULL 
THEN s1."ident"||'|1' 
WHEN s1."code" IS NOT NULL AND s2."code" IS NOT NULL AND s3."code" IS NULL 
THEN s2."ident"||'|2' 
WHEN s1."code" IS NOT NULL AND s2."code" IS NOT NULL AND s3."code" IS NOT NULL 
THEN s3."ident"||'|3' END AS "identifier", s1."code" 
FROM (select "ii"."fk", "ii"."scheme", "ii"."fk"||'|'||"ii"."scheme" AS "ident", "code" 
from "inidentifier" "ii" group by "fk", "scheme", "code") s1 
LEFT OUTER JOIN 
(select "ii"."fk", "ii"."scheme", "ii"."fk"||'|'||"ii"."scheme" AS "ident", "code" 
from "inidentifier" "ii" group by "fk", "scheme", "code") s2 ON s1."ident" = s2."ident" 
AND s1."code" < s2."code" 
LEFT OUTER JOIN 
(select "ii"."fk", "ii"."scheme", "ii"."fk"||'|'||"ii"."scheme" AS "ident", "code" 
from "inidentifier" "ii" group by "fk", "scheme", "code") s3 ON s1."ident" = s2."ident" 
AND s2."ident" = s3."ident" AND s1."code" < s2."code" AND s2."code" < s3."code" 
ORDER BY "identifier", s1."code") "cache" 
WHERE "cache"."identifier" IS NOT NULL 
내가 가진 문제는 그것이 어떤 생성하지 않습니다이다

| 예제 데이터, 끝에 3 위가해야 1이 될 것입니다. 그것은 23 | 2 | 2 9876과 23 | 2 | 2 6666으로 끝납니다.

데이비드

+1

어떤 데이터베이스를 사용하고 있습니까? (MySQL, Oracle SQLServer 등) – Andomar

+0

위의 ANSI SQL이 선호하지만 concat 함수는 킬러입니다. 테스트에 H2 사용. – Olddave

+2

레코드를 동일한 그룹으로 만드는 것에 대해 정교하게 (질문 편집) 할 수 있습니까? 나는 그 예에서 그것을 이해하지 못했습니다. (예제 8에서 올바른 id 8입니까?) –

답변

0

어떤 DBMS가 정상이면, 자연 접근 방식은 row_number() 것입니다 사전에 감사합니다

select * 
,  row_number() over (partition by fk, scheme order by id) as rn 
from YourTable 

이는 (fk, scheme) 그룹의 각 행에 대해 일련 번호를 반환합니다 .

+0

row_number()는 H2에서 지원하지 않으므로이 방법을 사용할 수 없습니다. – Olddave

+0

@Olddave : ** 요청하신대로 ** ** ANSI SQL입니다. 그리고 H2는 row_number()를 지원합니다 (주문하지 않아도) : http://h2database.com/html/functions.html#rownum –

+0

@a_horse_with_no_name, H2.3의 V.3146, ROW_NUM() 지원이 V 1.3.158. 가능하면 다른 방법을 찾아야합니다. – Olddave