2016-04-16 16 views
0

悲しいことに、人気のある「Greatest-N-Per-Group」クエリの別のバリエーションですが、それは私のお尻を蹴っていて、 )可能な限り:ジョイントを持つグループごとの最大N:間違った最大値/最小値

Items 
----- 
ItemID 
ProductName 


Inventory 
--------- 
InventoryID 
ItemID 
Condition 
Price 

そして、私は、各項目についてInventoryID、アイテムID、ItemNameの、条件、および最大の価格を表示するクエリを策定しようとしている:私は2つのテーブルを持っている

与えられた条件で

Inventory 
--------- 
InventoryID ItemID Condition Price 
INV123  ITEM001 NEW   $3.99 
INV001  ITEM001 NEW   $3.79 
INV031  ITEM001 USED  $1.23 
INV234  ITEM001 USED  $1.99 

やアイテム与えすなわち:

ItemID ItemName 
ITEM001 Lg Widget 
ITEM002 Sm Widget 

私は期待したい:

ItemID ItemName Condition MaxPrice MaxPriceInventoryID 
ITEM001 Lg Widget NEW  $3.99 INV123 
ITEM001 Lg Widget USED  $1.99 INV234 

私はこれをしようとしている:

残念ながら
SELECT 
    ItemID, ItemName, b.condition, b.maxprice, 
    InventoryID as MaxPriceInventoryID 
FROM 
    Items I join inventory v On i.ItemID= v.ItemID 
    join (
     select inventory.ItemID, max(Price) as MaxPrice, condition 
      from inventory join Items on inventory.ItemID = Items.ItemID 
      group by inventory.ItemID, condition) as b 
    on b.ItemID = v.ItemID and b.MaxPrice = v.Price 
ORDER BY 
    ItemName, Condition 

、これは」doesnの望ましい結果を出す:それは散発的に再現するようだ指定された条件のアイテムの最大価格ではなく、すべての条件にわたってアイテムの最大価格を設定します。

アイデア?

答えて

0

データがどのように関連しているか、どのようにフィルタリングする必要があるかは完全にはわかりません。

私はそれをこのように行うのだいずれか:あなただけの価格に関係を持っている場合でも、あなたはDENSE_RANK()を置き換えることができます1アイテムIDが必要な場合

SELECT i.ItemID 
    ,i.ItemName 
    ,vv.Condition 
    ,vv.Price AS MaxPrice 
    ,vv.MaxPriceInventoryID 
FROM Items i 
INNER JOIN (
    SELECT v.ItemID 
     ,v.InventoryID 
     ,v.Condition 
     ,v.Price 
     ,DENSE_RANK() OVER (PARTITION BY v.ItemID, v.Condition ORDER BY v.Price DESC) AS R 
    FROM Inventory v 
    WHERE 1 = 1 /* Place your filtering conditionals here */ 
    ) AS vv 
    ON i.ItemID = vv.ItemID 
WHERE vv.R = 1 
ORDER BY i.ItemName 
    ,vv.Condition 

SELECT ii.ItemID 
    ,ii.ItemName 
    ,ii.Condition 
    ,ii.Price AS MaxPrice 
    ,ii.MaxPriceInventoryID 
FROM (
    SELECT i.ItemID 
     ,i.ItemName 
     ,i.ProductName 
     ,v.InventoryID 
     ,v.Condition 
     ,v.Price 
     ,DENSE_RANK() OVER (PARTITION BY v.ItemID, v.Condition ORDER BY v.Price DESC) AS R 
    FROM Items i 
    INNER JOIN Inventory v 
     ON i.ItemID = v.ItemID 
    WHERE 1 = 1 /* Place your filtering conditionals here */ 
    ) AS ii 
WHERE ii.R = 1 
ORDER BY ii.ItemName 
    ,ii.Condition 

またはこの方法をROW_NUMBER()。ただし、OVER()句のORDER BYにキーフィールドを追加しない限り、結果は確定的ではありません。

関連する問題