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

Таким образом, ФК в сочетании со схемой делает повторяющуюся группу. Я знаю, что у меня только до 5 в повторяющейся группе, но мой тестовый запрос допускает только 3. Последовательный номер строки не будет использоваться в качестве украшения, он должен быть 1 или 2 или 3 только потому, что они используются для поиска в кэше.

Вот SQL, который я придумал, используя синтаксис H2 Db 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 ответ

Если с любой СУБД все в порядке, естественный подход row_number():

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

Это вернет порядковый номер для каждой строки в (fk, scheme) группа.

Другие вопросы по тегам