从具有相同 DisplayID 的 Table 中删除重复项
Remove Duplicates From Table With The Same DisplayID
我有一个 table 如下:
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,并留下具有最高 Itelevel 的那个。
HeidiSQL,MySQL
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
假设您使用 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
所以,这就是对你的盔甲进行排名 table。它按 '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
现在,您想要删除所有 'Ranking' 值不是 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() 的更多信息
尝试按照您的标准删除重复记录,但请注意,如果您在最高 Itelevel 中有重复记录,您将在输出中看到所有记录:
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
我有一个 table 如下:
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,并留下具有最高 Itelevel 的那个。
HeidiSQL,MySQL
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
假设您使用 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
所以,这就是对你的盔甲进行排名 table。它按 '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
现在,您想要删除所有 'Ranking' 值不是 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() 的更多信息尝试按照您的标准删除重复记录,但请注意,如果您在最高 Itelevel 中有重复记录,您将在输出中看到所有记录:
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