0

私はこのテーブルを持っています:

code |  Seq  | incr | Bin
------------------------
AQ   |  2701 |  1   | 1  
AQ   |  2702 |  2   | 0  
AQ   |  2703 |  3   | 1  
AQ   |  2704 |  4   | 1  
AQ   |  2705 |  5   | 1  
AQ   |  2706 |  6   | 1  
AQ   |  2707 |  7   | 1  
AQ   |  2708 |  8   | 0  
AQ   |  2709 |  9   | 1  
AQ   |  2710 | 10   | 1  
AQ   |  2711 | 11   | 0  
AQ   |  2712 | 12   | 1  

連続する「1」の最大数と、結果の数の「Seq」列の最初と最後の行の値を取得する必要があります。つまり、書かれた単純化されたテーブルの場合、最大カウントは「Seq」= 2703 から始まり「Seq」= 2707 で終わる「5」です。

したがって、次のような結果のテーブルが必要です。

code |  SeqStart  | SeqEnd | Count
----------------------------------
AQ   |    2703    |  2707  |   5  
AR   |    2712    |  2722  |  11  

これを解決しようとして、私はそれを考えました

"incr" - ( "Bin" = 0 で最大 "incr" の行の "incr" 値ですが、< "incr" の場合、3 から 7 までの "incr" の場合は 2、9 から 7 までの "incr" の場合は 8 になります。 10 )

これを行うには良い数学の方法かもしれませんが(ここに書いているので)各行の減算の適切な2番目の数の作業コードを書く方法が見つかりません

残念ながら、私は OpenOffice (3.4.1) を使用しているため、HSQLDB 1.8 で立ち往生しています。

4

2 に答える 2

1

hsql 1.8のみを使用して自分で解決策を見つけました-他の誰かがそれに興味を持っている可能性がある場合は投稿しています:

SELECT "a"."code", ("a"."Seq"-"b"."MaxNum" +1) AS "SeqStart", "a"."Seq" AS "SeqEnd", "b"."MaxNum" AS "Count" 
FROM 
    (SELECT DISTINCT "x"."code", "x"."Seq", "x"."incr", "x"."Bin", "y"."incr1", CASE WHEN "x"."Bin" = 1 THEN ("x"."incr"-"y"."incr1") ELSE '0' END AS "Num" 
    FROM "MyTable" AS "x" 
    LEFT JOIN 
    (SELECT "code", "incr", MAX("incr1") AS "incr1" 
    FROM 
        (SELECT "a"."code", "a"."incr", "b"."incr" AS "incr1" 
        FROM "MyTable" AS "a", "MyTable" AS "b" 
        WHERE ("b"."incr" BETWEEN '1' AND ("a"."incr" -1)) AND "b"."Bin" = 0) 
    GROUP BY "code", "incr") AS "y" 
    ON "y"."code" = "x"."code" AND "y"."incr" = "x"."incr") AS "a" 
INNER JOIN 
    (SELECT "code", MAX("Num") AS "MaxNum" 
    FROM 
        (SELECT DISTINCT "x"."code", "x"."Seq", "x"."incr", "x"."Bin", "y"."incr1", CASE WHEN "x"."Bin" = 1 THEN ("x"."incr"-"y"."incr1") ELSE '0' END AS "Num" 
        FROM "MyTable" AS "x" 
        LEFT JOIN 
        (SELECT "code", "incr", MAX("incr1") AS "incr1" 
        FROM 
            (SELECT "a"."code", "a"."incr", "b"."incr" AS "incr1" 
            FROM "MyTable" AS "a", "MyTable" AS "b" 
            WHERE ("b"."incr" BETWEEN '1' AND ("a"."incr" -1)) AND "b"."Bin" = 0) 
        GROUP BY "code", "incr") AS "y" 
        ON "y"."code" = "x"."code" AND "y"."incr" = "x"."incr") 
    GROUP BY "code") AS "b" 
ON "b"."code" = "a"."code" AND "b"."MaxNum" = "a"."Num"
于 2013-07-02T20:29:40.057 に答える
0

上記のクエリの調整されたバージョンを追加したいだけです。これは約 15 倍高速です。

SELECT "a"."code", ("a"."Seq"-"b"."MaxNum" +1) AS "SeqStart", "a"."Seq" AS "SeqEnd", "b"."MaxNum" AS "Count" 
FROM 
   (SELECT DISTINCT "x"."code", "x"."Seq", "x"."incr", "x"."Bin", "y"."incr1", CASE WHEN "x"."Bin" = 1 THEN ("x"."incr"-"y"."incr1") ELSE '0' END AS "Num" 
   FROM 
      "MyTable" AS "x" 
   LEFT JOIN 
      (SELECT "code", "incr", MAX("incr1") AS "incr1" 
      FROM 
         (SELECT "a"."code", "a"."incr", "b"."incr" AS "incr1" 
         FROM 
            "MyTable" AS "a" 
         INNER JOIN 
            ( SELECT "code", "incr", "Bin" 
            FROM 
               "MyTable" 
            WHERE "Bin" = 0 ) AS "b" 
         ON "b"."code" = "a"."code" AND ( "b"."incr" BETWEEN '1' AND ( "a"."incr" - 1 ) ) ) 
      GROUP BY "code", "incr") AS "y" 
   ON "y"."code" = "x"."code" AND "y"."incr" = "x"."incr") AS "a" 
INNER JOIN 
   (SELECT "code", MAX("Num") AS "MaxNum" 
   FROM 
      (SELECT DISTINCT "x"."code", "x"."Seq", "x"."incr", "x"."Bin", "y"."incr1", CASE WHEN "x"."Bin" = 1 THEN ("x"."incr"-"y"."incr1") ELSE '0' END AS "Num" 
      FROM 
         "MyTable" AS "x" 
      LEFT JOIN 
      (SELECT "code", "incr", MAX("incr1") AS "incr1" 
      FROM 
         (SELECT "a"."code", "a"."incr", "b"."incr" AS "incr1" 
         FROM 
            "MyTable" AS "a" 
         INNER JOIN 
            ( SELECT "code", "incr", "Bin" 
            FROM 
               "MyTable" 
            WHERE "Bin" = 0 ) AS "b" 
         ON "b"."code" = "a"."code" AND ( "b"."incr" BETWEEN '1' AND ( "a"."incr" - 1 ) ) ) 
      GROUP BY "code", "incr") AS "y" 
   ON "y"."code" = "x"."code" AND "y"."incr" = "x"."incr") 
GROUP BY "code") AS "b" 
ON "b"."code" = "a"."code" AND "b"."MaxNum" = "a"."Num"
于 2013-07-10T20:55:30.853 に答える