Какой самый простой способ сделать «SELECT TOP 5» для нескольких параметров? - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь создать новую базу данных в LibreOffice Base / HSQLDB, которая предположительно поддерживает стандартный SQL, но, вероятно, не так широко, как SQL-сервер или 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, иначе результаты будут неправильными.

Я также смотрел на выполнение подзапросов так:

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 голосов
/ 15 января 2019

Чтобы ваш собственный запрос работал, вам нужно предложение ORDER BYLIMIT) для каждого частичного запроса. Для этого используйте круглые скобки:

(
  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 ALL кстати. UNION [DISTINCT] - это особая форма объединения, которая удаляет дубликаты.

0 голосов
/ 15 января 2019

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;

В случае ничьей (несколько участников с одинаковым счетом) я должен выбрать участников произвольно.Сначала я выбираю тех, у кого самые низкие идентификаторы.

...