Sql server 具有联接的每个组的最大N:获取错误的最大/最小值
可悲的是,流行的“每个组最大N个”查询的另一个变体,但它一直在踢我的屁股,我真的需要一些澄清(问题尽可能简化): 我有两张桌子:Sql server 具有联接的每个组的最大N:获取错误的最大/最小值,sql-server,greatest-n-per-group,Sql Server,Greatest N Per Group,可悲的是,流行的“每个组最大N个”查询的另一个变体,但它一直在踢我的屁股,我真的需要一些澄清(问题尽可能简化): 我有两张桌子: Items ----- ItemID ProductName Inventory --------- InventoryID ItemID Condition Price 我正试图构造一个查询,它显示给定条件下每个项目的InventoryID、ItemID、ItemName、Condition和Max price i、 e.给定 Inventory -----
Items
-----
ItemID
ProductName
Inventory
---------
InventoryID
ItemID
Condition
Price
我正试图构造一个查询,它显示给定条件下每个项目的InventoryID、ItemID、ItemName、Condition和Max price
i、 e.给定
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
不幸的是,这并没有给出期望的结果:它似乎在所有条件下偶尔返回商品的最高价格,而不是在给定条件下返回商品的最高价格
想法?我并不完全清楚您的数据是如何关联的,或者您需要如何过滤 我要么这样做:
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
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
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
如果即使在价格上有联系的情况下,您也只需要一个ItemID,那么您可以用行号()替换密集列号()
。但是,除非在OVER()
子句中的orderby
中添加一个键字段,否则结果将不具有确定性