2016-11-22 7 views
-1

Je souhaite calculer le coefficient de Gini pour un certain nombre d'ensembles, contenant dans un tableau à deux colonnes (ici #cits) contenant une valeur et un ensemble -ID. J'ai expérimenté avec différents calculs de coefficient de Gini, décrit here (StackExchange query) et here (StackOverflow question with some good replies). Les deux exemples ne calculent qu'un seul coefficient pour une table, alors que je voudrais le faire avec une clause GROUP BY.Syntaxe SQL pour l'instruction complexe GROUP BY avec OVER: calcul du coefficient de Gini pour plusieurs ensembles

La table #cits contient deux colonnes, c et cid, respectivement la valeur et l'ID de jeu.

Voici mon essai actuel (incomplet):

select count(c) as numC, 
sum(c) as totalC, 
(select row_number() over(order by c asc, cid) id, c from #cits) as a 
from #cits group by cid 

sélection des oeuvres CSPN et TOTALC bien, bien sûr, mais la ligne suivante me donne un mal de tête. Je peux voir que la syntaxe est fausse, mais je ne peux pas comprendre comment assigner le row_number() par c par cid.

EDIT: Sur la base des suggestions, j'ai utilisé partition, comme ceci:

select cid,sumC = sum(a.id * a.c) 
into #srep 
from (
    select cid,row_number() over (partition by cid order by c asc) id, 
    c 
    from #cits 
) as a 
group by a.cluster_id1 


select count(c) as numC, 
    sum(c) as totalC, b.sumC 
into #gtmp 
from #cits a 
    join #srep b 
     on a.cid = b.cid 
group by a.cid,b.sumC 


select 
    gini = 2 * sumC/(totalC * numC) - (numC - 1)/numC 
from #gtmp 

Cette presque œuvres. J'obtiens un résultat, mais il est> 1, ce qui est inattendu, car le coefficient de Gini devrait être compris entre 0 et 1. Comme indiqué dans les commentaires, j'aurais préféré une solution à une requête, mais ce n'est pas un problème majeur du tout.

+1

Je pense que vous recherchez la partie partition de row_number, qui est votre "grouping". 'row_number() over (partition par c, ordre cid par c asc, cid)' – scsimon

+0

On dirait que tu as raison - j'ai regardé dans la partition depuis que j'ai posé cette question ici, et je pense que je suis proche d'une solution - même si m'a demandé d'utiliser deux requêtes ... Je voulais un, pour la beauté de celui-ci;) – ipoga

+1

vous pouvez en avoir un enveloppé dans un CTE, besoin de moi pour vous montrer? – scsimon

Répondre

1

Vous pouvez « partition » les données ligne afin de numérotation recommencerait pour chaque ID ... mais je ne suis pas sûr que ce soit ce que vous êtes après ..

Je suppose que vous voulez que le CID affiché lorsque vous le groupez.

select count(c) as numC 
    , sum(c) as totalC 
    , row_number() over(partition by cID order by c asc) as a 
    , cid 
from #cits group by cid 

Notez que vous n'avez pas besoin de la sous-requête.

Oui, ce n'est pas probable.

sortie

NumC TotalC A CID 
24 383 1 1 
15 232 1 2 
+0

Ce fut une aide précieuse pour arriver sur la bonne voie, s'il vous plaît voir mon édition. – ipoga

0

Si je comprends bien, vous avez besoin CSPN et TOTALC pour chaque C dans un jeu de cid, ainsi que la position du C à l'intérieur de cet ensemble. Cela devrait vous apporter ce dont vous avez besoin:

select 
    rn.cid, 
    rn.c, 
    row_number() over (partition by rn.cid order by rn.c) as id, 
    agg.numC, 
    agg.totalC 
from #cits rn 
    left outer join 
    (
     select 
      cid, 
      count(c) as numC, 
      sum(c) as totalC 
     from #cits 
     group by cid 
    ) agg 
     on rn.cid = agg.cid 
+0

Notez que je n'ai aucune donnée pour l'exécuter, donc il faudra peut-être l'ajuster – DForck42