2012-11-25 96 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