请解释使用分区的SQL
有人能解释一下下面的问题吗?ID不是PK,同一ID可以有多行。此查询获取最新的行请解释使用分区的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
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选择了记录。