2012-03-07 95 views
-1

的SQL可能有人请解释一下下面的查询? ID不是PK,并且对于相同的ID可以有多行。该查询获取最新的行。请解释与PARTITION

SELECT ID, SCORE, DATE_OF_SCORE FROM 
(
SELECT ID, SCORE, DATE_OF_SCORE, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DATE_OF_SCORE DESC) RN 
FROM PERSON_SCORE_DETAILS 
WHERE ID = 123 
) 
WHERE RN = 1; 
+0

@downvoter请解释。 – Vaandu 2012-03-07 10:05:45

回答

3

此查询选择id 123的最近date_of_score的得分。 由于您只选择一个id,因此这里的partition by子句是多余的。

而这种类型的查询更好地使用聚合,这样的处理:

select id 
    , max(score) keep (dense_rank last order by date_of_score) score 
    , max(date_of_score) date_of_score 
    from person_score_details 
where id = 123 
group by id 

或者更简单:

select 123 
    , max(score) keep (dense_rank last order by date_of_score) score 
    , max(date_of_score) date_of_score 
    from person_score_details 
where id = 123 

问候,
罗布。

+0

+1我没有发现内部查询只选择了一个ID的记录。 – APC 2012-03-07 10:06:20

3

ROW_NUMBER()是一个解析函数,在这种情况下返回的每一行不同的数的函数。 PARTITION子句控制生成行号的窗口,并且ORDER BY确定该分区内的行的排序。

因此,当你观察到内部查询产生许多对于每一行,复位为对于给定的ID的记录每次运行的开始,这个数字和反向日期顺序对它们进行排序。这意味着对每个ID的最新记录具有1对功能,RN的别名外部查询filteres行号,以产生一个结果集包括仅针对所有ID的最新记录。

分析函数从集合函数在(即GROUP BY),我们可以使用它们,而不必通过在投影中的所有列进行分区不同。当我们想返回其他列时,这使它们在查询中很有用。

Oracle文档是全面的,在线和自由。你应该学会导航它。 Find out more about analytic functions here