2017-05-16 1 views
0

J'ai des données stockées dans une table sous la forme de branches d'un arbre. Toutes ces branches ont été réalisées après un processus d'itération spécifique. Cependant, la séquence des branches faites par moi et la séquence des branches réellement requises ne sont pas exactement identiques. Pour plus de clarté, c'est la séquence requise pour les branches.Comment obtenir le sous-ensemble le plus proche (groupe de lignes) d'un autre groupe de lignes

enter image description here

Et les branches que j'ai fait sont aussi:

enter image description here

Ainsi, la Direction générale no. 5 en haut de l'image est assigné. 4 dans ma requête sql à cause de toutes les branches de couleur rouge faites après avoir fait toutes les branches de couleur noire.

Par conséquent, est-il possible, je pourrais décaler le numéro de branche. 9 de ma sortie sql à la branche requise. 4 à partir de la première capture d'écran, Red Branch no. 4 est le sous-ensemble le plus proche de Black Branch no. 3. Et de même Red Branch no. 6 est le sous-ensemble le plus proche de Black Branch no. 5 et 7 est pour 6.

Le contenu de ma table sql est aussi:

DECLARE @tbl AS TABLE(
     State_ID INT, 
     BranchNo INT, 
     Share FLOAT 
    ) 

INSERT INTO @tbl 
SELECT 30500095, 1 ,1 
UNION ALL SELECT 30500096, 1 ,0.0958083832335329 
UNION ALL SELECT 30500097, 1 ,0.5625 
UNION ALL SELECT 30500098, 1 ,0.222222222222222 
UNION ALL SELECT 30500099, 1 ,1 
UNION ALL SELECT 30500100, 1 ,0.5 
UNION ALL SELECT 30500101, 1 ,1 
UNION ALL SELECT 30500095, 2 ,1 
UNION ALL SELECT 30500096, 2 ,0.0958083832335329 
UNION ALL SELECT 30500097, 2 ,0.5625 
UNION ALL SELECT 30500098, 2 ,0.222222222222222 
UNION ALL SELECT 30500099, 2 ,1 
UNION ALL SELECT 30500102, 2 ,0.5 
UNION ALL SELECT 30500095, 3 ,1 
UNION ALL SELECT 30500096, 3 ,0.0958083832335329 
UNION ALL SELECT 30500097, 3 ,0.5625 
UNION ALL SELECT 30500103, 3 ,0.666666666666667 
UNION ALL SELECT 30500104, 3 ,0.666666666666667 
UNION ALL SELECT 30500105, 3 ,0.75 
UNION ALL SELECT 30500095, 4 ,1 
UNION ALL SELECT 30500096, 4 ,0.0958083832335329 
UNION ALL SELECT 30500097, 4 ,0.5625 
UNION ALL SELECT 30500103, 4 ,0.666666666666667 
UNION ALL SELECT 30500106, 4 ,0.333333333333333 
UNION ALL SELECT 30500107, 4 ,0.5 
UNION ALL SELECT 30500095, 5 ,1 
UNION ALL SELECT 30500096, 5 ,0.0958083832335329 
UNION ALL SELECT 30500108, 5 ,0.4375 
UNION ALL SELECT 30500109, 5 ,0.285714285714286 
UNION ALL SELECT 30500095, 6 ,1 
UNION ALL SELECT 30500096, 6 ,0.0958083832335329 
UNION ALL SELECT 30500108, 6 ,0.4375 
UNION ALL SELECT 30500110, 6 ,0.714285714285714 
UNION ALL SELECT 30500111, 6 ,0.4 
UNION ALL SELECT 30500095, 7 ,1 
UNION ALL SELECT 30500112, 7 ,0.904191616766467 
UNION ALL SELECT 30500113, 7 ,0.417218543046358 
UNION ALL SELECT 30500095, 8 ,1 
UNION ALL SELECT 30500096, 8 ,0.0958083832335329 
UNION ALL SELECT 30500097, 8 ,0.5625 
UNION ALL SELECT 30500095, 9 ,1 
UNION ALL SELECT 30500096, 9 ,0.0958083832335329 
UNION ALL SELECT 30500097, 9 ,0.5625 
UNION ALL SELECT 30500103, 9 ,0.666666666666667 
UNION ALL SELECT 30500104, 9 ,0.666666666666667 
UNION ALL SELECT 30500095, 10 ,1 
UNION ALL SELECT 30500096, 10 ,0.0958083832335329 
UNION ALL SELECT 30500097, 10 ,0.5625 
UNION ALL SELECT 30500103, 10 ,0.666666666666667 
UNION ALL SELECT 30500106, 10 ,0.333333333333333 
UNION ALL SELECT 30500095, 11 ,1 
UNION ALL SELECT 30500096, 11 ,0.0958083832335329 
UNION ALL SELECT 30500108, 11 ,0.4375 
UNION ALL SELECT 30500110, 11 ,0.714285714285714 
UNION ALL SELECT 30500095, 12 ,1 
UNION ALL SELECT 30500112, 12 ,0.904191616766467 

SELECT * FROM @tbl 

Répondre

0

Enfin j'ai trouvé la solution de ma tâche.

Cette requête porte Direction 9 près de la Direction générale:

SELECT TOP 1 
    b.branchno AS b2 
    ,COUNT(*) AS cnt 
FROM @tbl a 
INNER JOIN @tbl b 
    ON a.state_id = b.state_id 
WHERE b.branchno <> a.branchno 
AND a.branchno = 3 
AND b.branchno >= 3 
GROUP BY b.branchno 
ORDER BY cnt DESC, b2 
0

Vous pouvez utiliser pivot simple qui donnera ce résultat:

select * from @tbl 
pivot (max(share) for BranchNo in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10], [11], [12])) p 
+0

Merci pour la réponse. Je ne veux pas que la structure soit sauvegardée au format pivot, comme le montre la première image, mais je veux que la structure soit sauvegardée en seconde image. C'est juste que je veux que les numéros de branche soient ajustés de sorte que les sous-ensembles les plus proches puissent avoir un numéro à côté de leurs supersets seulement. –

+0

Oh maintenant je vois la différence que tu cherches –