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

What is the simplest way to do "SELECT TOP 5" for multiple parameters?

我正在尝试在 LibreOffice Base / HSQLDB 中构建一个新数据库,据说它支持标准 SQL,但可能不如 SQL-server 或甲骨文

我有一个 table 分数,其中参与者是俱乐部列表之一的成员。我需要生成 "Team Scores" 球队是动态的,即它们由每个俱乐部的前 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 或结果错了。

我也看过像这样做子查询:

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

等等

每组TOP 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 最低的。

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

(
  SELECT Score, ClubID 
  FROM ShootRecords 
  WHERE ShootRecords.ClubID = 0
  ORDER BY Score DESC
  LIMIT 5
)
UNION ALL
(
  SELECT Score, ClubID 
  FROM ShootRecords 
  WHERE ShootRecords.ClubID = 1
  ORDER BY Score DESC
  LIMIT 5
)
ORDER BY ClubID, Score DESC;

对了,是UNION ALLUNION [DISTINCT] 是一种特殊形式的联合,可以删除重复项。