Как получить максимальное значение из объединенной таблицы, которая будет включать более одного критерия? - PullRequest
0 голосов
/ 13 мая 2019

Я создал таблицы опроса.

  1. имена со странами
  2. вопросы (с идентификаторами)
  3. ответы (с идентификаторами)
  4. ответы(где пользователи ответили на вопросы)

Мне нужно получить самый популярный ответ по стране.Говоря по-другому, я должен выбрать значение MAX из COUNT для каждой «Страны»

SELECT Country, AnswersID, COUNT(AnswersID) AS TTL
FROM Responses 
LEFT JOIN Players AS Final ON Final.PlayersID = Responses.PlayersID
GROUP BY AnswersID, Country

Этот код выдает следующее:

Country | AnswersID | Total
-----------------------------
xxx     |     2     | 5
-------------------------------
xxx     |     1     | 2
-------------------------------
yyy     |     2     | 3
------------------------------
yyy     |     1     | 2

Что я ожидаю:

xxx 2 5
--------------------
yyy 2 3

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Предположительно, страна назначается игроку, а не ответу. Если это так, вам не нужно внешнее соединение (и уж точно не то, которое начинается с responses):

SELECT p.Country, r.AnswersID, COUNT(*) AS TTL
FROM Responses JOIN
     Players p
     ON p.PlayersID = r.PlayersID
GROUP BY p.Country, r.AnswersID

Затем вы можете использовать оконные функции, чтобы получить наибольшее общее количество по стране. Используйте rank(), чтобы получить все топовые ответы при наличии связей; используйте row_number(), чтобы получить только одну строку:

SELECT Country, AnswersID, TTL
FROM (SELECT p.Country, r.AnswersID, COUNT(*) AS TTL,
             RANK() OVER (PARTITION BY p.Country ORDER BY COUNT(*) DESC) as seqnum
      FROM Responses r JOIN
           Players p
           ON p.PlayersID = r.PlayersID
      GROUP BY p.Country, r.AnswersID
     ) c
WHERE seqnum = 1;

В статистике это наиболее распространенное значение называется mode .

1 голос
/ 13 мая 2019

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

SELECT country,
       answerid,
       ttl
       FROM (SELECT country,
                    answersid,
                    count(answersid) ttl,
                    row_number() OVER (PARTITION BY country
                                       ORDER BY count(answersid) DESC) r
                    FROM responses 
                         LEFT JOIN players final
                                   ON final.playersid = responses.playersid
                    GROUP BY answersid,
                             country)
       WHERE r = 1;

Использование row_number() приведет к получению только одной записи на страну, даже если два или более ответовподелитесь максимальным количеством.Если вы хотите показать все записи с максимумом, вы можете использовать rank() вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...