2012-11-25 4 views
3

Est-ce que quelqu'un sait comment obtenir le nombre maximal de séquences de chaque colonne dans une table. Par exemple, si avoir le tableau A qui présente les données suivantesRequête de nombre contigu MySQL maximum

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 | 

Comme vous pouvez le voir dans le tableau ci-dessus, je dois obtenir le nombre contigu maximum de numéros d'une rangée, dans l'exemple ci-dessus, j'ai ajouté la colonne ' Max '&' Ensembles 'pour afficher le résultat requis.

Dans la première rangée il y a 10 nombres contigus (1 à 10) et seulement 1 ensemble/groupe de nombres contingents, dans la seconde il y a seulement 4 (3,4,5,6) et 2 ensembles de nombres contingents (3 à 6 et 14 à 16).

J'essayais de comprendre cela depuis un certain temps mais je n'arrive pas à comprendre la requête requise (c'est-à-dire, joindre ou une instruction select et if). Je peux le faire dans d'autres langues mais préférerais que MySQL complète ce calcul.

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

SQL Fiddle Contient ma table et les données et je suis en train de faire la requête requise

+0

Bonne question .. dites-moi si elle serait résolue d'une manière plus facile – Sami

Répondre

0

Complete code and Demo Link

declare c1,cnt,max,cmax,pv,cv,sets int; 
  1. cnt ---- pour le nombre de lignes
  2. c1 - --- boucle invariante
  3. max --- obtient des valeurs contigu nt dans une des rangées de 10 colonnes
  4. Cmax - nombre actuel de valeurs contiguës
  5. pv ----- valeur précédente de la colonne de ligne courante
  6. cv ----- valeur courante de la colonne de ligne courante
  7. ensembles --- raconte comment beaucoup de jeux même nombre max contigus dans une rangée

Après avoir expliqué les variables que je me sentirais seulement besoin de parler de la condition suivante à répéter ainsi. 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;

Lorsque cv=pv+1 => valeur actuelle de la colonne = colonne précédente alors nous allons augmenter cmax cmax=cmax+1; et nous avons aussi besoin de deux chèques comme if cmax=max then sets=sets+1; et if cmax>max then max=cmax; et autrement quand cv!=pv+1 puis cmax=1

J'ai utilisé une table temporaire, inséré la valeur Max_Count et No_of_Sets pour chaque ligne. À la fin il est montré

Hope it helps dans ce que vous voulez :)

1

Désolé, je ne comprenais pas tout d'abord le commentaire sur SQLFiddle. J'ai testé le code là-bas et j'ai trouvé que j'avais besoin de réparer quelque chose de plus.

La requête nécessitait que les colonnes n * soient déplacées de l'expression groupée finale vers les agrégats et a (entre la première FROM et la seconde SELECT.) Et un COUNT ()> = 2 au lieu de COUNT ()> 2.

Maintenant, lorsque vous utilisez votre code de test, cela fonctionne.
Voici une URL pour le test http://sqlfiddle.com/#!2/9e3cb/21/0

corrigée Réponse:

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 

Réponse d'origine:
est ici une façon de le faire avec la requête ensembliste. Cette requête suppose que votre table s'appelle TableOfTen et qu'elle contient exactement 10 n [umber] [1..10] colonnes. Il peut être modifié pour toute table (ou table dérivée) pour laquelle le nombre de n [nombre] [...] colonnes est connu à l'avance.

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