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 组/组连续数,第二行只有 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 的评论。我在那里测试了代码,发现我需要修复更多的东西。

查询需要将 n* 列从最终的 group-by 表达式移动到聚合,以及 ( 在第一个 FROM 和第二个 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[number][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. sets --- 告诉连续有多少组相同的最大连续计数

在解释了变量之后,我觉得也只需要讲述以下重复条件。 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=> 当前列值 = 上一列时,我们将增加 cmaxcmax=cmax+1;并且我们还需要两个检查 as if cmax=max then sets=sets+1;and if cmax>max then max=cmax;否则当cv!=pv+1thencmax=1

我使用了一个临时表,为每一行插入了 Max_Count 和 No_of_Sets 值。最后显示

希望它对您想要的有所帮助:)

于 2012-11-25T15:15:42.490 回答