2012-11-25 100 views
3

有谁知道如何从表中每列获取最大序列计数。例如,如果有表A,其具有以下数据MySQL最大连续计数查询

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 | 

正如你从上表看上面我需要从一排得到号的最大连续数,在上面的例子中,我已经添加了列'最大'&'设置'显示所需的结果。

第一行有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包含我的表和数据,我试图做所需的查询

+0

好问题..告诉我,如果它会以更简单的方式解决 – Sami

回答

0

Complete code and Demo Link

declare c1,cnt,max,cmax,pv,cv,sets int; 
  1. CNT ----为行
  2. C1的数量 - ---循环不变式
  3. max ---得到最大连续值cou个nt 10列
  4. 的C max的一个行 - 连续值的当前计数
  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 =>当前列值=前一列然后我们将增加的Cmax cmax=cmax+1;和我们还需要两个检查作为 if cmax=max then sets=sets+1;if cmax>max then max=cmax;否则当cv!=pv+1然后cmax=1

我使用的临时表,为每一行插入Max_Count和No_of_Sets值。在结束它显示

希望它可以帮助你想要的东西:)

1

对不起,我没有先约SQLFiddle评论理解。我在那里测试了代码,发现我需要修补更多东西。

查询需要将n *个列从最终的group-by表达式移到聚合,以及(在第一个FROM和第二个SELECT之间 - 和COUNT()> = 2而不是COUNT()> 2.

现在在您的测试代码上运行时,它可以工作。
下面是测试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个[umber] [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