J'ai un jeu de données dans SQL Server 2012 avec une colonne d'identité et de valeur, comme ceci: mon objectif est d'obtenir un nombre de fréquences de toutes les combinaisons de [valeur], avec Deux mises en garde: p> L'ordre n'a pas d'importance, de sorte que [11,12,15] n'est pas compté séparément de [12,11,15] P>
li>
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] P>
li>
Je suis intéressé par toutes les combinaisons, de n'importe quelle longueur (pas seulement des paires) p>
li>
ol> donc le résultat ressemblerait à: p> 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. P> P>
3 Réponses :
Vous pouvez utiliser SQL Server 2012 ne prend pas en charge string_agg () code>: 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;
Votre chaîne de numéro est uniquement toutes les valeurs avec le même frapper chaque valeur en double avec un compteur, puis recherchez des groupes qui paient complètement. P> 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. 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;
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 | +----------+-----------+
Marquez votre moteur SQL.