Vertica技术问题:统计每行中多列标记字段的TRUE(1)值数量
解决Vertica中统计每行0/1标记字段1值数量的问题
嘿,这个需求在Vertica里处理起来很直观,给你几个实用的方案,根据你的场景选就行:
方案1:直接字段相加(最直接)
因为你的标记字段值只有0或1(或者可能存在NULL),直接把所有标记字段加起来就是1的总数。如果字段存在NULL的情况,记得用COALESCE把NULL转成0,避免NULL导致总和失效。
假设你的表名为marker_table,主键是ID,标记字段是m1到m108,SQL语句如下:
SELECT ID, COALESCE(m1, 0) + COALESCE(m2, 0) + COALESCE(m3, 0) + -- 这里继续补充m4到m107的字段 COALESCE(m108, 0) AS Sum_True FROM marker_table;
方案2:动态生成SQL(避免手动写108个字段)
手动写108个字段太麻烦?可以通过查询Vertica系统表自动生成需要的SQL语句:
SELECT 'SELECT ID, ' || STRING_AGG('COALESCE(' || column_name || ', 0)', ' + ') || ' AS Sum_True FROM marker_table;' FROM columns WHERE table_name = 'marker_table' AND column_name != 'ID' -- 排除主键字段 AND data_type IN ('integer', 'boolean'); -- 根据你的字段实际类型调整,布尔型也适用
执行这个查询后,会得到完整的相加语句,直接复制执行即可。
方案3:用UNPIVOT转行列统计
如果偏好行转列的思路,也可以用UNPIVOT把所有标记字段转成行,再统计每个ID的1的数量:
SELECT ID, COUNT(*) AS Sum_True FROM marker_table UNPIVOT ( flag_value FOR flag_name IN (m1, m2, ..., m108) -- 列出所有标记字段 ) AS unpivoted_data WHERE flag_value = 1 -- 只统计值为1的情况 GROUP BY ID;
这个方法逻辑更清晰,但同样需要列出所有标记字段,适合配合动态SQL生成字段列表使用。
小提醒
- 如果标记字段是
boolean类型,Vertica会自动把TRUE转成1、FALSE转成0,直接相加同样有效,用COALESCE(flag, FALSE)可以把NULL转为FALSE(即0)。 - 确保所有标记字段的类型是数值型或布尔型,避免类型转换错误。
内容的提问来源于stack exchange,提问作者El Dj
相关产品推荐
相关产品推荐

