请解释使用分区的SQL

请解释使用分区的SQL,sql,oracle,select,Sql,Oracle,Select,有人能解释一下下面的问题吗?ID不是PK,同一ID可以有多行。此查询获取最新的行 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; ROW\u NUMBER

有人能解释一下下面的问题吗?ID不是PK,同一ID可以有多行。此查询获取最新的行

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;
ROW\u NUMBER()
是一个分析函数,在本例中,该函数为每一行返回一个不同的数字。PARTITION子句控制生成行号的窗口,ORDER BY确定该分区内行的排序

因此,正如您所观察到的,内部查询为每一行生成一个数字,在给定ID的每次记录运行开始时重置该数字,并按相反的日期顺序对它们进行排序。这意味着每个ID的最新记录的行号为1。外部查询筛选该函数的别名,
RN
,以生成只包含所有ID的最新记录的结果集

分析函数不同于聚合函数(即,
分组),因为我们可以使用它们,而不必按投影中的所有列进行划分。当我们想要返回其他列时,这使得它们在查询中很有用


Oracle文档内容全面、在线且免费。你应该学会导航

此查询选择id 123的最新日期的分数。 这里的partitionby子句是多余的,因为您只选择了一个id

使用聚合可以更好地处理此类查询,如下所示:

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
问候,

Rob.

+1我没有发现内部查询只为单个ID选择了记录。