可能不是最好的标题,但下面的例子将解释一切:
我有一个结果集,看起来像这样:
TargetID CategoryID ListID Level
-------- ---------- ------ ----
104 8 29 5
104 8 37 5
104 8 7 3
104 8 7 3
我需要获得某个类别的最近(最高级别)列表。级别可以是任何数字。换句话说,我需要返回一组唯一的TargetID / CategoryID / ListID,但具有最高级别。 因此,过滤后的结果应包含:
TargetID CategoryID ListID Level
-------- ---------- ------ ----
104 8 29 5
104 8 37 5
答案 0 :(得分:0)
猜测你是指每个ListID中的最高级别。如果是这种情况,那么这里是SQL根据级别对行进行排名,然后外部查询过滤到顶部匹配(在这种情况下,最高级别)。
SELECT TargetID, CategoryID, ListID, Level
FROM
(
SELECT
TargetID, CategoryID, ListID, Level,
DENSE_RANK() OVER (PARTITION BY ListID ORDER BY Level DESC) AS LevelRank
FROM ...
) Ranked
WHERE Ranked.LevelRank = 1
更多关于胆量:
如果您想要所有数据中的最高级别(例如,5),那么这是查询的一个版本,然后只返回该级别的任何行(与上面相同,但没有分区):< / p>
SELECT TargetID, CategoryID, ListID, Level
FROM
(
SELECT
TargetID, CategoryID, ListID, Level,
DENSE_RANK() OVER (ORDER BY Level DESC) AS LevelRank
FROM ...
) Ranked
WHERE Ranked.LevelRank = 1
答案 1 :(得分:0)
看看我创建的这个sqlFiddle。小提琴中有两个单独的查询可能会给你你想要的东西。
http://sqlfiddle.com/#!2/4e8680/6/0
select * from test group by TargetId, CategoryId, ListId HAVING LEVEL = MAX(LEVEL);
第一个查询将返回每个targetId / CategoryId / ListId组的行,这些组具有该分组的最大级别。
SELECT * from test group by TargetId, CategoryId, ListId HAVING LEVEL = (SELECT MAX(LEVEL) FROM test);
第二个查询将返回TargetId / CategoryId / ListId组,其中LEVEL等于表中的最大级别。