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

从SQL结果集中获取具有最高级别的记录,sql,Sql,可能不是最好的标题,但以下示例将解释一切: 我有一个返回的结果集,如下所示: TargetID CategoryID ListID Level -------- ---------- ------ ---- 104 8 29 5 104 8 37 5 104 8 7

可能不是最好的标题,但以下示例将解释一切:
我有一个返回的结果集,如下所示:

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

我猜您指的是每个ListID中的最高级别。如果是这样的话,那么下面是基于级别对行进行排序的SQL,然后外部查询过滤到最热门的(在本例中,是最高级别)

更多关于勇气:

  • 通过设置为ListID进行分区,这样就可以为每个ListID单独设置排名(例如,如果ListID 14的最高级别为4,那么即使其他ListID的最高级别为5,我们也会保留该级别)。如果您希望它是全局最高级别的(独立于ListID),那么只需删除“PartitionbyListID”部分
  • ORDER BY定义了排名顺序;在这种情况下,最高级别排在第一位。如果每个级别有多个targetId,则将它们作为平局进行排序,因此两者都将返回。但是,如果您只想为每个ListID获取一行,请在ORDERBY子句中加入“TargetID”
下面是一个查询版本,用于确定您是否希望在所有数据中使用最高级别(例如,5),然后只返回具有该级别的任何行(与上面相同,但不包含分区):


看看我创建的sqlFiddle。小提琴中有两个独立的查询,它们可能会给出你想要的东西

第一个查询将返回每个targetId/CategoryId/ListId组的行,该组具有该分组的最大级别

SELECT * from test group by TargetId, CategoryId, ListId HAVING LEVEL = (SELECT MAX(LEVEL) FROM test);

第二个查询将返回TargetId/CategoryId/ListId组,其中级别等于表中的最大级别。

您可以发布获取结果集的查询吗?这是对视图的选择。视图无法更改,因为它在其他位置使用。其他3列非常明显,但如果这些值彼此独立,为什么
ListID
?@paqogomez的37和29都是独立的?@paqogomez:在附加到我的目标的类别下可以有多个列表。我只需要附加在最高级别的选项列表。
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
select * from test group by TargetId, CategoryId, ListId HAVING LEVEL = MAX(LEVEL);
SELECT * from test group by TargetId, CategoryId, ListId HAVING LEVEL = (SELECT MAX(LEVEL) FROM test);