首页 > 解决方案 > 如何编写我的 Postgres 查询以返回特定列中出现频率最高的值?

问题描述

我的数据库中有两个表,其中包含电影票信息(其列是电影 ID 和票证 ID)和电影放映信息(其列是电影标题、票证 ID 和放映时间)。我正在尝试编写一个 PSQL 查询,它允许我确定哪个特定的放映时间最受欢迎(即哪个放映时间在放映时间列中出现频率最高)

为了说明,到目前为止,我已经编写了查询以根据电影的 ID 为 15 返回特定电影的放映时间(例如 20:20、13:00)。

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.

我曾尝试研究此主题并输入别名,但我对 PSQL 不够熟悉,无法正确构建查询。有什么帮助吗?

标签: sqlpostgresql

解决方案


这是使用分析函数的一种方法:

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;

推荐阅读