对多个参数执行“ SELECT TOP 5”最简单的方法是什么?

时间:2019-01-15 13:17:00

标签: sql hsqldb libreoffice-base

我正在尝试在LibreOffice Base / HSQLDB中构建一个新数据库,该数据库应该支持标准SQL,但可能不如SQL Server或Oracle广泛。

我有一张分数表,参与者是俱乐部列表之一的成员。我需要在团队动态的情况下生成“团队得分”,即由每个俱乐部的前5个得分组成。

到目前为止,我能获得的最接近的结果是:

SELECT "Score", "ShootRecords"."ClubID" FROM  "ShootRecords" WHERE "ShootRecords"."ClubID" = 0

UNION 

SELECT "Score", "ShootRecords"."ClubID" FROM  "ShootRecords" WHERE "ShootRecords"."ClubID" = 1

ORDER BY "Score" DESC

如果我在每个子查询的开头添加一个TOP 5限定词,它将报告为无效的SQL。 如果我将ORDER BY子句移到子查询中,它再次报告为无效SQL,但是每个子查询都需要以这种方式进行排序,并限制为TOP 5或结果错误。 / p>

我也看过像这样子查询:

SELECT "ClubID"

FROM   "Clubs"

WHERE  "Clubs"."ClubID" IN

   (SELECT "ClubID"

    FROM "Clubs", "ShootRecords"

    WHERE "Clubs"."ClubID" = "ShootRecords"."ClubID"
    )

但再次说明,排序和子设置的顺序错误或无效。

我希望看到的像是这样:

Score     ClubID
------------------
300        0
299        0
280        0
200        0
190        0
310        1
290        1
277        1

2 个答案:

答案 0 :(得分:2)

要使自己的查询正常工作,您希望每个部分查询都包含一个 ORDER BY (和 LIMIT )子句。为此,请使用括号:

 (
  SELECT分数,ClubID
  从ShootRecords
  在哪里ShootRecords.ClubID = 0
  按分数排序
  极限5
)
全联盟
(
  SELECT分数,ClubID
  从ShootRecords
  在哪里ShootRecords.ClubID = 1
  按分数排序
  极限5
)
按ClubID排序,得分DESC;
 

顺便说一下,它是 UNION ALL UNION [DISTINCT] 是一种特殊的联合形式,可删除重复项。

答案 1 :(得分:0)

每个组的前n个查询通常使用解析函数来解决,但是HSQLDB不支持它们。

无论如何,要进入前五名就意味着好不到五个。

select *
from  shootrecords sr
where 5 >
(
  select count(*)
  from shootrecords better
  where better.clubid = sr
  and 
  (  better.score > sr.score
      or 
    (better.score = sr.score and better.memberid < sr.memberid) -- for the case of ties
  )
)
order by clubid, score, memberid;

如果出现平局(具有相同分数的多个成员),我必须任意选择成员。我首先选择ID最低的那些。