0

テーブル内の各繰り返しグループの各メンバーを連番で飾りたいと思います。だから:

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 を scheme と組み合わせると、繰り返しグループが作成されます。繰り返しグループに最大 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 になります。別のアプローチでしょうか?

前もって感謝します

デビッド

4

1 に答える 1

0

どの DBMS でも問題がなければ、自然なアプローチは次のようになりますrow_number()

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

(fk, scheme)これにより、グループ内の各行の連番が返されます。

于 2012-06-13T07:43:30.867 に答える