从SQL结果集中获取具有最高级别的记录

时间:2014-06-12 20:56:45

标签: sql

可能不是最好的标题,但下面的例子将解释一切:
我有一个结果集,看起来像这样:

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

2 个答案:

答案 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

更多关于胆量:

  • PARTITION BY设置为ListID使得我们的排名是针对每个ListID独立设置的(例如,如果ListID 14的最高级别是4,我们保持这一点,即使其他一些ListID具有最高水平5)。如果您希望它是全局最高级别(独立于ListID),则只需删除" PARTITION BY ListID"片
  • ORDER BY定义排名顺序;在这种情况下,最高级别排名第一。在每个级别有多个TargetID的情况下,它将它们排列为平局,因此两者都将被返回。但是,如果你只想为每个ListID获得1行,那就扔掉",TargetID"进入ORDER BY子句。

如果您想要所有数据中的最高级别(例如,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等于表中的最大级别。