2012-06-13 21 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 

我会在我的结果看

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 

与方案,以便FK相结合,使重复组。我知道我在重复组中只有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 

我的问题是,它不会产生任何与A | 3月底,在示例数据上面应该有最后是23 | 2 | 2 9876和23 | 2 | 2 6666.不同的方法可能是?

预先感谢您

大卫

+1

您正在使用哪个数据库? (MySQL,Oracle SQLServer等) – Andomar

+0

以上任何一种,首选ANSI SQL,但是concat函数是杀手。使用H2进行测试。 – Olddave

+2

你能详细说明(编辑问题)什么使记录成为同一组?我没有从这个例子中弄明白。 (在示例输出中id 8是否正确) –

回答

0

如果任何DBMS是确定的,自然的做法是row_number()

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

这将在(fk, scheme)组返回一个序列号的每一行。

+0

由于H2不支持row_number(),所以不能使用此方法。 – Olddave

+0

@Olddave:但它**是** ANSI SQL,如你所请求的。 H2支持row_number()(虽然没有排序):http://h2database.com/html/functions.html#rownum –

+0

@a_horse_with_no_name,我们坚持H2的V1.3.146,ROW_NUM()支持进来了V 1.3.158。如果可能的话,我需要找到另一种方式。 – Olddave