基于User Count扩展表格行并拆分节目列值:Google Apps Script/PostgreSQL实现
实现方案:按用户数拆分节目行
Google Apps Script(Google Sheets 适用)
逻辑说明
遍历源数据表的每一行,根据User Count的数值生成对应数量的新行:
- 保留原行的
ID和Household字段 - 新行的
User Count固定设为1 - 依次将
Show 1到Show 4的节目值分配到对应新行,每行仅保留一个节目值,其余Show列为空
代码实现
function splitUserRows() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const data = sheet.getDataRange().getValues(); const header = data[0]; const result = [header]; // 保留表头 // 遍历源数据行(跳过表头) for (let i = 1; i < data.length; i++) { const row = data[i]; const id = row[0]; const household = row[1]; const userCount = row[2]; const shows = row.slice(3, 7); // 获取Show 1到Show 4的值 // 生成对应数量的新行 for (let j = 0; j < userCount; j++) { const newRow = [id, household, 1]; // 初始化所有Show列为空 for (let k = 0; k < 4; k++) { newRow.push(''); } // 将当前节目值放入对应Show列 newRow[3 + j] = shows[j]; result.push(newRow); } } // 清空原表并写入结果(可根据需求调整写入位置) sheet.clearContents(); sheet.getRange(1, 1, result.length, result[0].length).setValues(result); }
PostgreSQL 实现
逻辑说明
使用generate_series生成对应数量的行号,结合CASE语句将每个Show列的值分配到对应行,最终生成符合要求的拆分结果。
代码实现
假设源表名为household_shows,执行以下SQL查询即可得到目标结果:
SELECT id, household, 1 AS "User Count", CASE WHEN seq = 1 THEN "Show 1" ELSE '' END AS "Show 1", CASE WHEN seq = 2 THEN "Show 2" ELSE '' END AS "Show 2", CASE WHEN seq = 3 THEN "Show 3" ELSE '' END AS "Show 3", CASE WHEN seq = 4 THEN "Show 4" ELSE '' END AS "Show 4" FROM household_shows CROSS JOIN generate_series(1, "User Count") AS seq ORDER BY id, seq;
说明
CROSS JOIN generate_series(1, "User Count")会根据每行的User Count生成对应数量的行,seq作为行序号标记CASE语句根据seq的值,将对应Show列的内容填充到新行中,其余Show列设为空字符串- 最终结果按
ID和行序号排序,保证节目顺序与源表一致
内容的提问来源于stack exchange,提问作者Jose Buelto Perez
相关产品推荐
相关产品推荐

