3

テーブルの各列から最大シーケンス数を取得する方法を知っている人はいますか? たとえば、次のデータを持つテーブル A があるとします。

id | n1 | n2 | n3 | n4 | n5 | n6 | n7 | n8 | n9 | n10| Max | Sets
----------------------------------------------------------------
1  | 1  | 2  | 3  | 4  | 5  | 6  | 7  | 8  | 9  | 10 |  10 | 1 |
2  | 1  | 3  | 4  | 5  | 6  | 8  | 14 | 15 | 16 | 25 |  4  | 2 |
3  | 4  | 8  | 9  | 15 | 18 | 19 | 55 | 64 | 65 | 98 |  2  | 3 |
4  | 41 | 55 | 66 | 67 | 68 | 69 | 74 | 82 | 131| 132|  4  | 2 |

上の表からわかるように、行から最大連続数を取得する必要があります。上記の例では、必要な結果を表示するために列「Max」と「Sets」を追加しました。

最初の行には 10 個の連続する数字 (1 から 10) と連続する数字の 1 つのセット/グループのみがあり、2 番目の行には 4 つ (3,4,5,6) と 2 つの連続する数字のセット (3 から 6) のみがあります。および 14 から 16)。

私はかなり長い間これを理解しようとしてきましたが、必要なクエリを理解できません (つまり、結合または直接選択と if ステートメント)。これは他の言語でも実行できますが、MySQL でこの計算を完了させたいと考えています。

FOR i <= count(column)
IF count > sequence 
THEN sequence = count
ELSE count ++
NEXT i

SQL Fiddleテーブルとデータが含まれており、必要なクエリを作成しようとしています

4

2 に答える 2

1

申し訳ありませんが、最初は SQLFiddle に関するコメントを理解できませんでした。そこでコードをテストしたところ、さらに修正する必要があることがわかりました。

クエリでは、最後の group-by 式から集計に n* 列を移動する必要があり、最初の FROM と 2 番目の SELECT の間に ( と COUNT( ) > 2 ではなく COUNT( ) >= 2 を配置する必要がありました。

テストコードで実行すると、動作します。
テストの URL は次のとおりですhttp://sqlfiddle.com/#!2/9e3cb/21/0

正解:

SELECT id, MAX(n1) n1, MAX(n2) n2, MAX(n3) n3, MAX(n4) n4, MAX(n5) n5,  
MAX(n6) n6, MAX(n7) n7, MAX(n8) n8, MAX(n9) n9, MAX(n10) n10,  
MAX(GrpSize) Max, COUNT(GrpNumber) Sets  
FROM (  
    SELECT id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, GrpNumber, COUNT(*) GrpSize  
    FROM (  
        SELECT id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,  
        CASE Numbers.N  
        WHEN 1 THEN n1 - N  
        WHEN 2 THEN n2 - N  
        WHEN 3 THEN n3 - N  
        WHEN 4 THEN n4 - N  
        WHEN 5 THEN n5 - N  
        WHEN 6 THEN n6 - N  
        WHEN 7 THEN n7 - N  
        WHEN 8 THEN n8 - N  
        WHEN 9 THEN n9 - N  
        WHEN 10 THEN n10 - N  
        END GrpNumber  
        FROM `mytbl`  
        CROSS JOIN (  
            SELECT 1 AS N UNION ALL  
            SELECT 2 AS N UNION ALL  
            SELECT 3 AS N UNION ALL  
            SELECT 4 AS N UNION ALL  
            SELECT 5 AS N UNION ALL  
            SELECT 6 AS N UNION ALL  
            SELECT 7 AS N UNION ALL  
            SELECT 8 AS N UNION ALL  
            SELECT 9 AS N UNION ALL  
            SELECT 10 AS N  
        ) Numbers  
    ) TT  
    GROUP BY id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,GrpNumber  
    HAVING COUNT(*) >= 2  
) TT  
GROUP BY id  

元の回答:
セットベースのクエリでそれを行う方法は次のとおりです。このクエリでは、テーブルの名前が TableOfTen であり、正確に 10 個の n[数][1..10] 列があると想定しています。n[number][...] 列の数が事前にわかっている任意のテーブル (または派生テーブル) に対して変更できます。

SELECT id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, MAX(GrpSize) MaxSize, COUNT(GrpNumber) NumberOfSetsWithTwoOrMoreMembers  
FROM  (
    SELECT id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,GrpNumber, COUNT(*) GrpSize  
    FROM 
        SELECT id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,  
        CASE Numbers.N  
        WHEN 1 THEN n1 - N  
        WHEN 2 THEN n2 - N  
        WHEN 3 THEN n3 - N  
        WHEN 4 THEN n4 - N  
        WHEN 5 THEN n5 - N  
        WHEN 6 THEN n6 - N  
        WHEN 7 THEN n7 - N  
        WHEN 8 THEN n8 - N  
        WHEN 9 THEN n9 - N  
        WHEN 10 THEN n10 - N  
        END GrpNumber  
        FROM `mytbl`  
        CROSS JOIN (  
            SELECT 1 AS N UNION ALL  
            SELECT 2 AS N UNION ALL  
            SELECT 3 AS N UNION ALL  
            SELECT 4 AS N UNION ALL  
            SELECT 5 AS N UNION ALL  
            SELECT 6 AS N UNION ALL  
            SELECT 7 AS N UNION ALL  
            SELECT 8 AS N UNION ALL  
            SELECT 9 AS N UNION ALL  
            SELECT 10 AS N  
        ) Numbers  
    ) TT  
    GROUP BY id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,GrpNumber  
    HAVING COUNT(*) > 2  
) TT  
GROUP BY id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10  
于 2012-11-25T16:20:21.417 に答える
0

完全なコードとデモ リンク

declare c1,cnt,max,cmax,pv,cv,sets int;
  1. cnt ---- 行数
  2. c1 ----- ループ不変
  3. max --- 10 列の行の最大連続値数を取得します
  4. cmax -- 連続する値の現在の数
  5. pv ----- 現在の行の前の列の値
  6. cv ----- 現在の行の現在の列の値
  7. セット --- 行内の同じ最大連続カウントのセット数を示します

変数を説明した後、次の繰り返し条件についても説明するだけでよいと思います。 if cv=pv+1 then set cmax=cmax+1; if cmax=max then set sets=sets+1; end if; if cmax>max then set max=cmax; end if; else set cmax=1;end if;set pv=cv;

cv=pv+1=> 現在の列の値 = 前の列の場合、cmaxを cmax=cmax+1;増やし ます。if cmax=max then sets=sets+1;if cmax>max then max=cmax;cv!=pv+1cmax=1

一時テーブルを使用し、各行に Max_Count と No_of_Sets の値を挿入しました。最後に表示されます

あなたが望むものに役立つことを願っています:)

于 2012-11-25T15:15:42.490 に答える