如何在Snowflake SQL中计算多列的横向众数
计算每行多列数据的众数
问题说明
我目前只会计算单列数据的众数,不知道怎么横向合并多列(如下方示例里的Column A、Column B、Column C)来计算每行的众数。
输入输出示例
输入数据
| ID | Column A | Column B | Column C |
|---|---|---|---|
| 1 | cat | cat | dog |
| 2 | dog | cat | dog |
| 3 | cat | cat | dog |
| 4 | bird | cat | bird |
输出结果
| ID | Column A | Column B | Column C | Mode |
|---|---|---|---|---|
| 1 | cat | cat | dog | cat |
| 2 | dog | cat | dog | dog |
| 3 | cat | cat | dog | cat |
| 4 | bird | cat | bird | bird |
解决方案
1. Excel/Google Sheets 实现
直接使用MODE.SNGL函数,针对每行的目标列计算众数:
- 在E2单元格(对应第一行的Mode列)输入公式:
=MODE.SNGL(B2:D2) - 下拉填充公式到所有行即可
注:Excel 2019及以后版本、Google Sheets支持直接用
MODE.SNGL处理文本类型数据;如果是旧版Excel,可使用INDEX(B2:D2,MODE(MATCH(B2:D2,B2:D2,0)))实现兼容。
2. Python Pandas 实现
通过自定义函数按行处理数据,计算每行众数:
import pandas as pd def get_row_mode(row): # 获取当前行的众数,若有多个取第一个 mode_result = row.mode() return mode_result.iloc[0] if not mode_result.empty else None # 构造示例数据(实际场景可替换为pd.read_csv/pd.read_excel读取数据) data = { 'ID': [1, 2, 3, 4], 'Column A': ['cat', 'dog', 'cat', 'bird'], 'Column B': ['cat', 'cat', 'cat', 'cat'], 'Column C': ['dog', 'dog', 'dog', 'bird'] } df = pd.DataFrame(data) # 对指定列按行计算众数,新增Mode列 df['Mode'] = df[['Column A', 'Column B', 'Column C']].apply(get_row_mode, axis=1) print(df)
3. SQL 实现(以PostgreSQL为例)
通过将每行多列转为多行统计次数,再判断众数:
SELECT ID, "Column A", "Column B", "Column C", -- 按出现次数排序,取出现次数最多的第一个值 FIRST_VALUE(val) OVER ( PARTITION BY ID ORDER BY COUNT(val) DESC, -- 若次数相同,取最先出现的列的值 CASE val WHEN "Column A" THEN 1 WHEN "Column B" THEN 2 WHEN "Column C" THEN 3 END ) AS Mode FROM ( -- 将每行的三列拆分为多行数据 SELECT ID, "Column A", "Column B", "Column C", unnest(ARRAY["Column A", "Column B", "Column C"]) AS val FROM your_table ) t GROUP BY ID, "Column A", "Column B", "Column C", val ORDER BY ID;
内容的提问来源于stack exchange,提问作者Aadhil Imam
相关产品推荐
相关产品推荐

