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