如何按特定条件合并SQL表中B与BC记录的co列数据
解决方案:合并B与BC记录的SQL实现
针对你给出的表结构和需求,我们可以通过窗口函数来识别同一日期(cd)下的B和BC记录,然后按规则合并字段。以下是具体的SQL代码和解释:
实现代码
SELECT CASE WHEN has_bc THEN b_id ELSE id END AS id, cd, CASE WHEN has_bc THEN b_ct ELSE ct END AS ct, CASE WHEN has_bc THEN 'B,BC' ELSE co END AS co FROM ( SELECT t.*, -- 获取同一cd下B记录的id MAX(CASE WHEN co = 'B' THEN id END) OVER (PARTITION BY cd) AS b_id, -- 获取同一cd下B记录的ct值 MAX(CASE WHEN co = 'B' THEN ct END) OVER (PARTITION BY cd) AS b_ct, -- 标记同一cd下是否存在BC记录 BOOL_OR(co = 'BC') OVER (PARTITION BY cd) AS has_bc, -- 标记同一cd下是否存在B记录 BOOL_OR(co = 'B') OVER (PARTITION BY cd) AS has_b FROM table1 t ) sub -- 过滤掉:当同一cd下存在B记录时的BC原记录 WHERE NOT (co = 'BC' AND has_b);
代码解释
- 子查询部分:
- 使用窗口函数
PARTITION BY cd按日期分组,识别每组内的B记录信息(b_id、b_ct)。 - 通过
BOOL_OR函数标记每组内是否同时存在B和BC记录。
- 使用窗口函数
- 外层查询:
- 当同一日期下同时存在B和BC时,用B记录的
id和ct,并将co合并为B,BC。 - 过滤掉重复的BC记录(当同一日期已有B记录时,不再保留原BC记录)。
- 对于仅存在B或仅存在BC的记录,直接保留原字段值。
- 当同一日期下同时存在B和BC时,用B记录的
执行结果
运行上述代码后,将得到如下结果:
| id | cd | ct | co |
|---|---|---|---|
| 0 | 1/1/2018 | 12:00:00 | B,BC |
| 2 | 1/12/2018 | 12:00:00 | B |
| 3 | 1/22/2018 | 12:00:00 | BC |
这个结果完全符合你的需求:合并了同一日期下的B和BC记录,使用B记录的对应字段值,同时保留了无匹配项的单独记录。
内容的提问来源于stack exchange,提问作者Ms workaholic
相关产品推荐
相关产品推荐

