Как мне написать мой запрос Postgres, чтобы вернуть значение, которое происходит с максимальной частотой в определенном столбце? - PullRequest
0 голосов
/ 09 марта 2020

У меня есть две таблицы в моей базе данных, в которых есть информация для билетов mov ie (столбцы которых mov ie ID и ID билета) и для просмотров mov ie (столбцы mov ie title, ticket ID и время показа). Я пытаюсь написать запрос PSQL, который позволяет мне определить, какое именно время показа c является наиболее популярным (т. Е. Какое время показа происходит с наибольшей частотой в столбце времени показа)

Кому проиллюстрируйте, я до сих пор написал свой запрос, чтобы вернуть время показа определенного mov ie (например, 20:20, 13:00) на основе идентификатора mov ie, равного 15.

SELECT show_time FROM screenings
      INNER JOIN tickets
      ON screenings.ticket_id = tickets.id
      WHERE screenings.film_id = 15

Давайте представим, что этот запрос возвращает ряд раз, например 20:20, 18:05, 13:00, 20:20. Теперь я хочу расширить этот запрос, чтобы он возвращал время показа, наиболее часто встречающееся в результатах (в данном случае это 20:20). Я пробовал использовать несколько разных подходов, но ни один из них еще не работал. Я попытался ввести выше, как подзапрос, как:

SELECT MAX(*) FROM
      (SELECT COUNT(show_time)
      FROM screenings
      INNER JOIN tickets
      ON screenings.ticket_id = tickets.id
      WHERE screenings.film_id = 15)

Но затем я получаю ошибку:

ERROR:  subquery in FROM must have an alias
LINE 2:    (SELECT COUNT(show_time)
           ^
HINT:  For example, FROM (SELECT ...) [AS] foo.

Я попытался исследовать эту топи c и ввести псевдоним, но я не достаточно знаком с PSQL, чтобы правильно структурировать запрос. Любая помощь?

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Вот один из способов использования функций analyti c:

SELECT show_time
FROM (SELECT show_time, COUNT(*) as cnt,
             ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) as seqnum
      FROM screenings s JOIN
           tickets t
           ON s.ticket_id = t.id
      WHERE s.film_id = 15
      GROUP BY show_time
     ) st
WHERE seqnum = 1;
0 голосов
/ 09 марта 2020

Вы можете использовать функцию mode():

SELECT mode() within group (order by show_time) as most_frequent_show_time
FROM screenings
  JOIN tickets ON screenings.ticket_id = tickets.id
WHERE screenings.film_id = 15;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...