LibreOffice Base如何在查询中添加基于耗时的Placement排名字段?
给LibreOffice Base竞赛查询添加排名字段
直接把你的排名计算逻辑改成关联子查询,替换主查询里的(HERE)就行,不用手动拼接teamId,子查询会自动匹配当前行的队伍ID:
SELECT "Team_ID", "Team_Shortname", "TotalTimeInSeconds", ( SELECT COUNT(*) + 1 FROM "Team" AS t2 WHERE t2."TotalTimeInSeconds" < t1."TotalTimeInSeconds" ) AS "Placement" FROM "Team" AS t1 ORDER BY "TotalTimeInSeconds" ASC;
关键说明
- 给主表
Team起别名t1,子查询里的表起t2,避免同一张表被重复引用时混淆 - 子查询会统计所有耗时比当前队伍短的队伍总数,加1是因为排名从1开始——比如没人比你快,那你就是第1名
- 最后加
ORDER BY "TotalTimeInSeconds" ASC,能让结果按耗时从短到长展示,和排名顺序对应
处理并列排名的情况
如果有多个队伍耗时完全一样,上面的语句会给他们不同的排名(比如两个最快的队伍,会显示第1和第2)。要是想让相同耗时的队伍排名一致,用下面的写法:
SELECT "Team_ID", "Team_Shortname", "TotalTimeInSeconds", ( SELECT COUNT(DISTINCT "TotalTimeInSeconds") + 1 FROM "Team" AS t2 WHERE t2."TotalTimeInSeconds" < t1."TotalTimeInSeconds" ) AS "Placement" FROM "Team" AS t1 ORDER BY "TotalTimeInSeconds" ASC;
这里用COUNT(DISTINCT "TotalTimeInSeconds"),统计的是比当前耗时短的不同耗时值的数量,加1后,相同耗时的队伍就会拿到一样的排名。
内容的提问来源于stack exchange,提问作者schuler-ph
相关产品推荐
相关产品推荐

