从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”
看看我创建的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);