假设您使用 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() 的更多信息