代码之家  ›  专栏  ›  技术社区  ›  Bob McBobson

如何编写PSQL查询以返回特定列中以最大频率出现的值?

  •  0
  • Bob McBobson  · 技术社区  · 5 年前

    我的数据库中有两个表,其中包含电影票(其列为电影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不够熟悉,无法正确地构造查询。有什么帮助吗?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Gordon Linoff    5 年前

    下面是使用解析函数的一种方法:

    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;