如何通过查询获得主组内最频繁值(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 中的seasonsmember_casual 和 most_frequent_route 的组合。 这正是我的想法。

以上是关于如何通过查询获得主组内最频繁值(MODE)的计数/频率?的主要内容,如果未能解决你的问题,请参考以下文章

从字符串和整数的元组,得到元组内最接近给定值的数字

sql中如何查看某一字段值有几个数值

我们如何通过自定义消息和计数获得 MS Sql 查询的输出?

如何使用MySQL查询某个列中相同值的数量统计

普罗米修斯获得整数计数

如何在火花数据框组内进行计数(*)