bigquery-在多个列中使用group&max-类似于透视表

pgx2nnw8  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(289)

您将如何通过sql实现这一点?举个例子

| id | type | score_a | score_b | score_c | label_a | label_b | label_c |
|----|------|---------|---------|---------|---------|---------|---------|
| 1  | A    | 0.9     |         |         | L1      |         |         |
| 1  | B    |         | 0.7     |         |         | L2      |         |
| 1  | B    |         | 0.2     |         |         | L3      |         |
| 1  | C    |         |         | 0.2     |         |         | L4      |
| 1  | C    |         |         | 0.18    |         |         | L5      |
| 1  | C    |         |         | 0.12    |         |         | L6      |
| 2  | A    | 0.6     |         |         | L1      |         |         |
| 2  | A    | 0.3     |         |         | L2      |         |         |

我想返回每个 typelabel_X ,几乎类似于透视表,但具有这些自定义列名。因此,上述结果如下:

| id | type | score_a | label_a | score_b | label_b | score_c | label_c |
|----|------|---------|---------|---------|---------|---------|---------|
| 1  | A    | 0.9     | L1      | 0.7     | L2      | 0.2     | L4      |
| 2  | A    | 0.6     | L1      | NULL    | NULL    | NULL    | NULL    |

像这样的东西是错误的,因为它每分钟都会产生两个结果 typelabel ```
SELECT id,
MAX(score_a) as score_a,
label_a,
MAX(score_b) as score_b,
label_b as label_b,
MAX(score_c) as score_c,
label_c
FROM sample_table
GROUP BY id, label_a, label_b, label_c

有没有一种简单的方法可以通过sql来实现这一点,我现在正在bigquery中进行,并尝试了这里描述的pivot表,但在如何将这些数据展平为一个包含多个列的大行方面仍然没有成功
还有其他想法吗?
更新
扩展bgm提到的设计;此数据的来源是一个具有以下格式的表:
idtypelabelscore
1AL10.9
1BL20.7
1BL30.2
1CL40.6
1CL50.2
将转换为平坦状态,如问题顶部所示,使用以下查询

SELECT id,
type,
MAX(CASE WHEN type = 'A' THEN score ELSE 0 END) as score_a,
MAX(CASE WHEN type = 'B' THEN score ELSE 0 END) as score_b,
MAX(CASE WHEN type = 'C' THEN score ELSE 0 END) as score_c,
MAX(CASE WHEN model_type = 'theme' THEN label_score ELSE 0 END) as
-- labels
(CASE WHEN type = 'A' THEN label ELSE '' END) as label_a,
(CASE WHEN type = 'B' THEN label ELSE '' END) as label_b,
(CASE WHEN type = 'C' THEN label ELSE '' END) as label_c,
FROM table
GROUP id, label_a, label_b, label_c

你认为中间的步骤是没有必要得到最终的解决方案吗?
j0pj023g

j0pj023g1#

你可以做条件聚合。在大查询中,数组在这方面很方便:

select
    id,
    max(score_a) score_a,
    array_agg(label_a order by score_a desc limit 1)[offset(0)] label_a,
    max(score_b) score_b,
    array_agg(label_b order by score_b desc limit 1)[offset(0)] label_b,
    max(score_c) score_c,
    array_agg(label_c order by score_c desc limit 1)[offset(0)] label_c
from mytable
group by id

注意:在设计方面,不应该有多个列来存储每个类型的分数和标签;您已经有了一个表示类型的列,因此对于store和type应该只有两个列。

相关问题