-1
votes

Fréquence de toutes les combinaisons de valeurs pour certaines colonnes

J'ai un jeu de données dans SQL Server 2012 avec une colonne d'identité et de valeur, comme ceci: xxx

mon objectif est d'obtenir un nombre de fréquences de toutes les combinaisons de [valeur], avec Deux mises en garde:

  1. L'ordre n'a pas d'importance, de sorte que [11,12,15] n'est pas compté séparément de [12,11,15]

  2. Les valeurs répétées sont comptées séparément, la [11,11,12,15] est comptée séparément de [11,12,15]

  3. Je suis intéressé par toutes les combinaisons, de n'importe quelle longueur (pas seulement des paires)

    donc le résultat ressemblerait à: xxx

    J'ai vu des réponses voici impliquant une récursion qui répondent à des questions similaires, mais où la commande compte et répète impliquant des jointures auto-jointes qui produisent des combinaisons de paire de paires. Celles-ci s'approchent mais je ne suis pas tout à fait sûr comment s'adapter à mes besoins spécifiques.


1 commentaires

Marquez votre moteur SQL.


3 Réponses :


1
votes

Vous pouvez utiliser string_agg () code>: xxx pré>

SQL Server 2012 ne prend pas en charge string_agg () code> mais vous pouvez utiliser le XML Hack: P>

select vals, count(*) as frequency
from (select id,
             stuff( (select concat(',', value)
                     from t t2
                     where t2.id = i.id
                     for xml path ('')
                    ), 1, 1, ''
                  ) as vals
      from (select distinct id from t) i
     ) i
group by vals;


0 commentaires

0
votes

Votre chaîne de numéro est uniquement toutes les valeurs avec le même ID code> dans la commande croissante. Donc, je traite le code> ID code> comme nom canonique pour la séquence complète et toutes ses correspondances. Cela dépare toutes les manipulations de chaîne, bien que vous puissiez développer si nécessaire.

frapper chaque valeur en double avec un compteur, puis recherchez des groupes qui paient complètement. P>

with data as (
    select id, value,
        row_number() over (partition by id, value) as rn
), matches as (
    select l.id, r.id as match
    from data l full outer join data r on
         l.value = r.value and l.rn = r.rn and l.id <= r.id
    group by l.id
    having count(l.id) = count(*) and count(r.id) = count(*)
)
select id, count(match) as frequency
from matches
group by id;


0 commentaires

0
votes

Vous pouvez obtenir cette utilisation en utilisant des fonctions CTES et Row_Number.

+----------+-----------+
|  combo   | frequency |
+----------+-----------+
| 11,11,15 |         1 |
|    12,13 |         2 |
| 12,13,15 |         1 |
+----------+-----------+


0 commentaires