SQL左外连接查询中使用DENSE_RANK()计算两个维度排名的实现问题
你可以直接在关联查询的SELECT子句中加入两个窗口函数计算逻辑,即可一步得到你需要的结果,无需分多次查询:
SELECT b.*, c.releasedate, DENSE_RANK() OVER(ORDER BY b.sprintenddate DESC) AS `rank_sprint`, DENSE_RANK() OVER(ORDER BY c.releasedate DESC) AS `rank_release` FROM digitalpfatforms.issues_braze b LEFT JOIN jira.releases c ON b.version_id = c.versionid;
补充说明
- 窗口函数的计算逻辑是在表关联、WHERE过滤等前置操作执行完成后才运行,所以上述写法的结果和你先做关联、再基于关联结果算排名的效果完全一致
- 字段别名的引用符号可以根据你使用的数据库调整:MySQL类数据库用反引号
`,PostgreSQL、Hive、Snowflake等数据库可以用双引号" - 如果你后续需要基于排名做过滤(比如只取最近3个迭代的结果),可以把上述查询封装为子查询或CTE再做筛选,示例如下:
WITH base_data AS ( SELECT b.*, c.releasedate, DENSE_RANK() OVER(ORDER BY b.sprintenddate DESC) AS `rank_sprint`, DENSE_RANK() OVER(ORDER BY c.releasedate DESC) AS `rank_release` FROM digitalpfatforms.issues_braze b LEFT JOIN jira.releases c ON b.version_id = c.versionid ) SELECT * FROM base_data WHERE rank_sprint <= 3;
内容的提问来源于stack exchange,提问作者Adriana Ferro
相关产品推荐
相关产品推荐

