如何通过查询获得主组内最频繁值(MODE)的计数/频率?
Posted
技术标签:
【中文标题】如何通过查询获得主组内最频繁值(MODE)的计数/频率?【英文标题】:How to get the COUNT/frequency of the most frequent value(MODE) within the main group by query? 【发布时间】:2021-11-22 03:37:56 【问题描述】:这是我的查询:
WITH subtable AS (
SELECT
member_casual,
seasons,
start_station_name || ' to ' || end_station_name AS route
FROM
bike_data
)
SELECT
member_casual,
seasons,
MODE() WITHIN GROUP (ORDER BY route) AS most_frequent_route,
COUNT(*) AS total_service_used_count
FROM
subtable
GROUP BY
member_casual,
seasons;
结果如下:
当我想在这个 groupby 结果中包含 most_frequent_route
的频率/计数作为新列时,困难就来了。在这里问之前,我之前问过一个很好的前辈,他说:
将主查询放入 CTE 中,然后在新的外部查询中编写一个标量子查询,对子表中的行与分组 CTE 中的行匹配的子表执行计数。
老实说,我并不真正了解此建议的核心逻辑,因此我无法真正将所有这些放在一起作为一个完整的查询。谁能给我一些例子如何使它工作?提前谢谢!
【问题讨论】:
【参考方案1】:也许这位好心的前辈是这个意思:
WITH subtable_a AS (
SELECT
member_casual,
seasons,
start_station_name || ' to ' || end_station_name AS route
FROM
bike_data
),
subtable_b as
(
SELECT
member_casual,
seasons,
MODE() WITHIN GROUP (ORDER BY route) AS most_frequent_route,
COUNT(*) AS total_service_used_count
FROM
subtable_a
GROUP BY
member_casual,
seasons
)
select sb.*,
(
SELECT count(*)
from subtable_a sa
where sa.member_casual = sb.member_casual
and sa.seasons = sb.seasons
and sa.route = sb.most_frequent_route
) as most_frequent_route_count
from subtable_b sb;
您的 subtable
变为 subtable_a
,您的主查询变为 subtable_b
(将主查询放入 CTE)并在新的主(外部)查询中从 subtable_b
和标量子查询列中选择所有内容 -括号内大写的SELECT count(*)
- 提取most_frequent_route_count
。
【讨论】:
感谢@Stefanov.sm,它有效!我肯定正在从这个很棒的答案中研究核心逻辑,所以每当出现关于子查询和 CTE 的类似问题时,我都可以重新应用这个概念! 如果我对这个查询理解正确,使用SELECT count(*) from subtable_a sa
的原因是我想找出路由的数量,它只来自主表;之后,只需应用条件来缩小主表大小,使其适合出现在 subtable_b 中的seasons
、member_casual
和 most_frequent_route 的组合。
这正是我的想法。以上是关于如何通过查询获得主组内最频繁值(MODE)的计数/频率?的主要内容,如果未能解决你的问题,请参考以下文章