Я изо всех сил пытался решить это весь день - это кажется довольно простым, но я должен что-то упустить!
У меня есть запрос, который возвращает некоторые данные, два столбца, которые он возвращает, -"PackageWeight" и "PackageGroup".По сути, я хочу отфильтровать эти данные, чтобы показать только одну строку для каждой «PackageGroup» - это должна быть строка с наибольшим значением в столбце «PackageWeight».
Это кажется простым, но я просто могу 'заставить его работать в SQL Server, используя комбинацию TOP 1 и GROUP BY.Я должен что-то упустить!
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
Этот запрос возвращает мне полный набор данных, который мне нужно отфильтровать.Однако мои попытки пока не увенчались успехом: (
Любая помощь высоко ценится!
РЕДАКТИРОВАТЬ - Спасибо авторам ниже, пока у меня есть следующий запрос:
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
Пока все хорошо. Я все же посмотрю на оператор APPLY, предложенный @gbn, так как он для меня новый - и мне все еще нужно провести некоторое тестирование, чтобы убедиться, что этот запрос работает на 100%.времени. Однако начальные показания хороши!
Спасибо всем, кто уже внес свой вклад.
EDIT 2 - К сожалению, после заполнения базы данных большим количеством примеров данныхэтот запрос не сработал. Кажется, что пропущены некоторые записи.
Возможно, мне нужно объяснить немного больше о том, что здесь происходит. Данные, возвращаемые моим исходным запросом, перечисляют каждого клиента в системевместе с производным PackageID (рассчитанным по этому запросу), а также весом и группой, назначенными этому Package в таблице поиска.
Мне нужно отфильтровать исходную таблицу результатов, чтобы не получить мобольше, чем один пакет из каждой группы, для каждого клиента (каждый клиент может иметь пакет из одной или нескольких групп, но может не иметь пакет из каждой группы)
Я рассмотрю этот вопрос более свежим завтра, так какЯ думаю, что могу оказаться в ситуации «Не вижу леса за деревьями»!
Спасибо всем.