0

我有一张如下表:

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 Duplicates 并留下最高 Itemlevel 的那个。

海蒂SQL,MySQL

4

3 回答 3

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

于 2015-04-15T19:54:51.523 回答
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() 的更多信息

于 2015-04-15T19:57:00.403 回答
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
于 2015-04-15T20:02:08.350 回答