Filtrage des résultats retournés par la requête SQL
J'ai eu du mal à faire ce travail tout l'après-midi -, il semble assez simple, mais quelque chose doit m'échapper!
J'ai une requête qui renvoie des données, deux des colonnes il renvoie sont "PackageWeight" et "PackageGroup". Essentiellement, je veux filtrer ces données de façon à montrer qu'une seule ligne pour chaque "PackageGroup" - qui doit être la ligne avec la valeur la plus élevée dans la "PackageWeight" de la colonne.
Cela semble simple, mais je ne peux pas le faire fonctionner dans SQL Server à l'aide d'une combinaison de 1 et de GROUPE PAR. Quelque chose doit m'échapper!
SELECT VendorID, PackageID, PackageWeight, PackageGroup
FROM (SELECT VendorID, COUNT(*) AS qty
FROM VendorServices
GROUP BY VendorID
) cs
JOIN (SELECT PackageServices.PackageID, lookupPackages.PackageWeight, lookupPackages.PackageGroup, COUNT(*) AS qty
FROM PackageServices
JOIN lookupPackages ON PackageServices.PackageID = lookupPackages.PackageID
GROUP BY PackageServices.PackageID, lookupPackages.PackageWeight, lookupPackages.PackageGroup
) ps ON cs.qty >= ps.qty
WHERE (SELECT COUNT(*)
FROM VendorServices cs2
JOIN PackageServices ps2 ON cs2.ServiceTypeID = ps2.ServiceID
WHERE cs2.VendorID = cs.VendorID
AND ps2.PackageID = ps.PackageID
) = ps.qty
Cette requête me renvoie les données complètes, que j'ai besoin de filtre vers le bas. Cependant mes tentatives ont jusqu'à présent échoué 🙁
Toute aide appréciée!
MODIFIER - Merci aux contributeurs ci-dessous, pour l'instant j'ai la requête suivante:
with result_cte as
(
SELECT VendorID, PackageID, PackageWeight, PackageGroup,
RANK() over (partition by PackageGroup order by PackageWeight desc) as [rank]
FROM (SELECT VendorID, COUNT(*) AS qty
FROM VendorServices
GROUP BY VendorID
) cs
JOIN (SELECT PackageServices.PackageID, lookupPackages.PackageWeight, lookupPackages.PackageGroup, COUNT(*) AS qty
FROM PackageServices
JOIN lookupPackages ON PackageServices.PackageID = lookupPackages.PackageID
GROUP BY PackageServices.PackageID, lookupPackages.PackageWeight, lookupPackages.PackageGroup
) ps ON cs.qty >= ps.qty
WHERE (SELECT COUNT(*)
FROM VendorServices cs2
JOIN PackageServices ps2 ON cs2.ServiceTypeID = ps2.ServiceID
WHERE cs2.VendorID = cs.VendorID
AND ps2.PackageID = ps.PackageID
) = ps.qty
)
select *
from result_cte
WHERE [rank] = 1
ORDER BY VendorID
Donc bon. Je vais encore prendre un coup d'oeil à l'APPLIQUER opérateur suggéré par @gbn comme c'est nouveau pour moi et j'ai encore besoin de faire quelques tests pour s'assurer que cette requête ne fonctionne 100% du temps. Cependant, les premières indications sont bonnes!
Merci à tous ceux qui ont contribué jusqu'à présent.
EDIT 2 - Malheureusement, après le remplissage de la base de données avec plus de données, par exemple, cette requête ne fonctionne pas. Il semble manquer des entrées.
Peut-être j'ai besoin d'expliquer un peu plus sur ce qui se passe ici. Les données renvoyées par ma requête d'origine listes de chaque client dans le système, ainsi que les dérivés PackageID (calculé par cette requête) et le poids et le groupe assigné à ce Package dans une table de recherche.
J'ai besoin de filtrer les résultats originaux de tableau, de sorte que je n'ai pas de plus d'un paquet de chaque groupe, pour chaque client (chaque client peut avoir un package à partir d'un ou plusieurs groupe mais peut ne pas avoir un paquet de chaque groupe)
Je vais prendre un plus fraîche de regarder cela demain car je pense que je pourrais être dans un " ne Peut pas voir la forêt pour les arbres de la situation!
Merci à tous.
- double possible de SQL Serveur - SÉLECTIONNEZ le TOP 5 lignes pour chaque FK ou stackoverflow.com/q/1164483/27535. Et des dizaines d'autres: stackoverflow.com/questions/tagged/greatest-n-per-group
- quelle version de SQL Server que vous utilisez?
- SQL Server 2008.
- dans ce cas, tous les liens que j'ai donné sont valides.
- Merci pour les pointeurs. Cela semble si simple, mais pour une raison que j'ai du mal à le faire fonctionner comme je m'attends. Je n'ai pas trouver la CROIX APPLIQUER l'opération dans l'un de vos exemples avant - donc, je vais aller jeter un oeil dans cette. Merci beaucoup.
- Yeap, vous devriez jeter un oeil à l'un de ces liens. Dans les versions antérieures, cela pourrait devenir plus difficile.
Vous devez vous connecter pour publier un commentaire.
Pouvez-vous essayer cela? Ce n'est pas à l'épreuve des balles si vous avez plusieurs enregistrements avec le même poids dans le même groupe. Il y a d'autres façons de le gérer.
Ou vous pouvez faire ceci:
Êtes-vous prêt à accepter un seul arbitraire vendeur et
PackageID
si plusieurs paquets ont le même poids max dans un groupe? Si OK, il suffit de mettre un agrégat sur eux ainsi que l'PackageWeight
:Sinon, vous aurez besoin de faire comme E. Y. suggère et ne la requête imbriquée d'abord trouver le poids maximum par groupe et de traiter les doublons, le cas échéant, de vous-même.
Vous pouvez utiliser la fonction MAX:
Merci pour le post d'Eric.K.Yung - j'ai enfin résolu ce problème à l'aide de sa requête, mais l'ajout de VendorID (effectivement code client) à la "partition par' partie de la requête. Cela permet de garantir que les paquets ont été retournés pour tous les clients.
Merci à tous ceux qui ont contribué. La dernière question est: