によって返された結果のフィルタリングすべての午後にこれを処理するのに苦労しています。SQLクエリ
いくつかのデータを返すクエリがあります。返される列のうち2つは "PackageWeight"と "PackageGroup"です。基本的には、このデータをフィルタリングして、各 "PackageGroup"ごとに1行だけを表示する必要があります。これは、 "PackageWeight"列の値が最も高い行です。
これは単純ですが、TOP 1とGROUP BYの組み合わせを使用してSQL Serverで動作させることはできません。私は何かが欠けているに違いない!
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
このクエリは、私がフィルタリングする必要がある完全なデータセットを返します。しかし、私の試みはこれまで失敗している:(
すべてのヘルプははるかに高く評価
EDIT - おかげで以下の貢献者に、これまでのところ私は持っている次のクエリ:!
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
これまでのところ、そうこれは私にとって新しくなっている@gbnで提案されているAPPLY演算子を見ていますが、このクエリが100%時間で動作することを確認するためにはまだテストを行う必要があります。
これまで貢献してくれたすべての人に感謝します。
EDIT 2 - 悲しいことに、より多くのサンプルデータをデータベースに入力した後、このクエリは機能しませんでした。それはいくつかのエントリを欠場するようです。
多分私はここで何が起こっているかについてもう少し説明する必要があります。元のクエリで返されるデータには、システム内のすべての顧客と、派生したPackageID(そのクエリで計算されたもの)と、そのパッケージに割り当てられたグループおよびグループがルックアップテーブルにリストされます。
元の結果テーブルをフィルタリングして、顧客ごとに各グループから複数のパッケージを取得する必要があります(各顧客は1つ以上のグループのパッケージを持つことができますが、
明日は私が「樹木のために木を見ることができない」状況にあるかもしれないと思うので、これをもっと先に見てみましょう!
ありがとうございます。
可能重複(http://stackoverflow.com/questions/1450603/sql-server-select-top-5-rows -for-each-fk)またはhttp://stackoverflow.com/q/1164483/27535を参照してください。さらに多くの:http://stackoverflow.com/questions/tagged/greatest-n-per-group – gbn
どのバージョンのSQL Serverを使用していますか? – Lamak
@Lamak - SQL Server 2008. – JimmE