我有一张表如下:
Name DisplayID InventoryType Itemlevel RequiredLevel
Armor1 4 4 566 90
Armor2 123 30 566 90
Armor3 123 30 540 90
Armor4 123 10 540 90
我想要做的是,从每个InventoryType中删除DisplayId重复项,并保留具有最高项目级别的那个。
HeidiSQL,MySQL
答案 0 :(得分:0)
SELECT a.name, a.DisplayID, a.InventoryType, a.Itemlevel, a.RequiredLevel
FROM Item_template a
WHERE a.Itemlevel = (SELECT MAX(b.Itemlevel) FROM Item_template b where a.DisplayID = b.DisplayID)
SQL FIDDLE:http://sqlfiddle.com/#!9/bba95/1/0
答案 1 :(得分:0)
假设您使用MS SQL作为数据库服务器,您可以执行以下操作。我不知道这是否是最有效的方法,但是你会得到你想到的结果。
declare @armorTable table (
name nvarchar(10),
displayId int,
inventoryType int,
itemLevel int,
requiredLevel int
)
insert into @armorTable values ('Armor1',4,4,566,90)
insert into @armorTable values ('Armor2',123,30,566,90)
insert into @armorTable values ('Armor3',123,30,540,90)
insert into @armorTable values ('Armor4',123,10,540,90)
select
*
from
(
select
*,
(RANK() OVER (PARTITION BY displayId, inventoryType ORDER BY displayId, inventoryType, itemLevel)) Ranking
from
@armorTable
) subQuery
where
Ranking = 1
所以,这样做是排名你的盔甲表。它通过" displayId'对它进行分区(分组)。和' inventoryType',然后按照找到的顺序对结果进行排名。因为我在' itemLevel'上订购了它,你给出了最高的itemLevel RANK 1和下一个RANK 2等等。
这给出了以下结果:
name displayId inventoryType itemLevel requiredLevel Ranking
Armor1 4 4 566 90 1
Armor4 123 10 540 90 1
Armor3 123 30 540 90 1
Armor2 123 30 566 90 2
现在,您要删除所有'排名'另一个值大于1.因为您不能在where子句中直接使用RANK(),所以必须使用子查询来执行此操作。
执行此操作时,您会得到以下结果:
name displayId inventoryType itemLevel requiredLevel Ranking
Armor1 4 4 566 90 1
Armor4 123 10 540 90 1
Armor3 123 30 540 90 1
您可以在MSDN
上找到有关RANK()的更多信息答案 2 :(得分:0)
请尝试按照您的条件删除重复记录,但请注意,如果您在最高的Itemlevel中有重复项,那么您将在输出中看到所有这些记录:
DELETE Table1
FROM Table1
LEFT JOIN (SELECT DisplayID, InventoryType, MAX(Itemlevel) AS MaxItem
FROM Table1
GROUP BY DisplayID, InventoryType) AS Table2
ON Table1.InventoryType = Table2.InventoryType
AND Table1.DisplayID = Table2.DisplayID
AND Table1.Itemlevel = Table2.MaxItem
WHERE Table2.MaxItem IS NULL