SQL选择具有相等值的多行的行数和Id值

SQL选择具有相等值的多行的行数和Id值,sql,sql-server,select,group-by,Sql,Sql Server,Select,Group By,我们有此表,用于商店中的产品,其值如下: Id Name PartNumber Param1 Param2 Param3 Stock Active -- --------- ---------- ------ ------ ------ ----- ------ 1 BoxA1 10000 20 A B 4 1 2 BoxA1

我们有此表,用于商店中的产品,其值如下:

Id   Name       PartNumber   Param1    Param2    Param3   Stock   Active
--   ---------  ----------   ------    ------    ------   -----   ------
1    BoxA1      10000        20        A         B        4       1
2    BoxA1      10000.a      20        A         B        309     1
3    CabinetZ2  30000        40        B         C        0       0
4    CabinetZ2  30000.b      40        B         C        1098    1
5    BoxA1      10000.c      20        A         B        15      1
Id   Name       PartNumber   Param1    Param2    Param3   Stock   Active
--   ---------  ----------   ------    ------    ------   -----   ------
1    BoxA1      10000        20        A         B        4       0      <- Not active
2    BoxA1      10000.a      20        A         B        309     1      <- Active 
3    CabinetZ2  30000        40        B         C        0       0
4    CabinetZ2  30000.b      40        B         C        1098    1
5    BoxA1      10000.c      20        A         B        15      0      <- Not active
如您所见,有些产品具有相同的名称和参数,但Id和零件号不同

Id为1、2和5的产品具有相同的名称和参数值

我们需要根据库存禁用相同的param产品,因此我们只有那些具有相同param的产品中库存更多的产品处于活动状态

结果应该是这样的:

Id   Name       PartNumber   Param1    Param2    Param3   Stock   Active
--   ---------  ----------   ------    ------    ------   -----   ------
1    BoxA1      10000        20        A         B        4       1
2    BoxA1      10000.a      20        A         B        309     1
3    CabinetZ2  30000        40        B         C        0       0
4    CabinetZ2  30000.b      40        B         C        1098    1
5    BoxA1      10000.c      20        A         B        15      1
Id   Name       PartNumber   Param1    Param2    Param3   Stock   Active
--   ---------  ----------   ------    ------    ------   -----   ------
1    BoxA1      10000        20        A         B        4       0      <- Not active
2    BoxA1      10000.a      20        A         B        309     1      <- Active 
3    CabinetZ2  30000        40        B         C        0       0
4    CabinetZ2  30000.b      40        B         C        1098    1
5    BoxA1      10000.c      20        A         B        15      0      <- Not active
结果如下:

Id   Name       PartNumber   Param1    Param2    Param3   Stock   Items
--   ---------  ----------   ------    ------    ------   -----   ------
1    BoxA1      10000        20        A         B        4       3
3    CabinetZ2  30000        40        B         C        0       2
问题是我们得到的是找到的第一个Id,而不是库存更多的Id

我们期待这样的结果,但无法找到修复此查询的方法或解决方法:

Id   Name       PartNumber   Param1    Param2    Param3   Stock   Items
--   ---------  ----------   ------    ------    ------   -----   ------
2    BoxA1      10000.a      20        A         B        309     3
4    CabinetZ2  30000.b      40        B         C        1098    2
你的问题中有一个模棱两可的地方:如果两个ID都有相同的库存,它们都是活动的,还是只有一个?如果只有一个,那么什么决定了优先级

如果希望两者都处于活动状态:

WITH t AS (SELECT MAX(stock) OVER (PARTITION BY Name, Param1, Param2, Param3) max_stock,* FROM Products)
UPDATE t
SET Active = CASE WHEN stock = max_stock THEN 1 ELSE 0 END

我想这就是你要找的。我不知道你为什么需要rownumber()


我在sql server中使用了RANK函数,并在desc中对其进行排序,请参见下面的代码:

select Id,
    name,
    partnumber,
    param1,
    param2,
    param3, 
    stock,
    active 
    from (
        select *, 
            RANK() (parition by id, param1, param2, param3 order by stock desc) as max_stock 
            from product)x
        where max_stock = 1

谢谢工作起来很有魅力。只有一个精度,您错过了OVER after RANK()。
SELECT * FROM Products p1
INNER JOIN
(SELECT Name, PartNumber, MAX(Stock) AS MaxStock
FROM Products
GROUP BY Name, PartNumber) AS p2
ON p1.Name = p2.Name AND p1.PartNumber = p2.PartNumber AND p1.Stock = p2.MaxStock;
select Id,
    name,
    partnumber,
    param1,
    param2,
    param3, 
    stock,
    active 
    from (
        select *, 
            RANK() (parition by id, param1, param2, param3 order by stock desc) as max_stock 
            from product)x
        where max_stock = 1