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.

InformationsquelleAutor JimmE | 2011-11-28