Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 具有联接的每个组的最大N:获取错误的最大/最小值_Sql Server_Greatest N Per Group - Fatal编程技术网

Sql server 具有联接的每个组的最大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 -----

可悲的是,流行的“每个组最大N个”查询的另一个变体,但它一直在踢我的屁股,我真的需要一些澄清(问题尽可能简化):

我有两张桌子:

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
中添加一个键字段,否则结果将不具有确定性