sql - 如何编写我的 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 不够熟悉,无法正确构建查询。有什么帮助吗?
解决方案
这是使用分析函数的一种方法:
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;
推荐阅读
- r - 安装包“汽车”在 R 3.6.0 中具有非零退出状态
- javascript - 如果我换页,为什么动画不起作用?
- c++ - TCP IOCP:WSASend 是否可以在部分发送它的缓冲区(如 WSARecv 函数)后向等待线程发布通知?
- python - 如何修复 ImportError
- android - 从 Google 控制台中移除 Open Beta
- javascript - 使用具有不同字段值的 findOneAndUpdate
- mysql - 在唯一列值列表中嵌套第二个查询
- asp.net-web-api - ASP.Net Core 2.2:无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息
- amazon-web-services - Terraform 创建具有多个目标的 Cloudwatch 规则
- python - 使用 Python 从 XML 文件中名称中带有“:”的标记中获取值