我想根据下面的col c
组合行,并将他们的value
列数据相加。行按照它们的组合方式进行颜色编码。
这需要在col a
col b
和date
字段匹配时发生,并且只有在col c
='事情1'或者'事情2'。我不想将匹配的行合并到thing 1
或thing 2
之外的任何内容。
第一个问题,这在SQL或Pandas中更容易实现吗?
第二个问题:以最简单的方式,我将如何实现这一目标?
我的SQL尝试:
select col_a, col_b, date, SUM(value::numeric) as thing_1_thing_2 from mytable where col_c = 'thing 1' or col_c = 'thing 2' group by col_a, col_b, date;
但这并没有让我得到我期待的总结。此外,聚合本身会从输出中删除我仍然需要的列(例如上面未突出显示的行)。我只需要合并彩色行,其他所有行保持不变。
答案 0 :(得分:1)
您可以选择thing 1
和thing 2
行,然后使用string_agg()
汇总这些行以连接您的值。然后UNION
表示所有非thing 1/thing 2
行:
SELECT
colA,
colB,
string_agg(colC,' ') as colC,
date,
sum(Value) as Value
FROM myTable
WHERE colC IN ('thing 1', 'thing 2')
GROUP BY colA, colB, date
UNION ALL
SELECT colA, colB, colC, date, value
FROM myTable
WHERE colC NOT IN ('thing 1', 'thing 2')
或者你可以将一个CASE语句扔进混音中并一次性完成:
SELECT
colA,
colB,
CASE WHEN colC IN ('thing 1', 'thing 2') THEN 'Thing 1 Thing 2` ELSE colC END as colC,
date,
sum(Value) as Value
FROM myTable
GROUP BY colA,
colB,
CASE WHEN colC IN ('thing 1', 'thing 2') THEN 'Thing 1 Thing 2` ELSE colC END,
date
我认为第一个更具可伸缩性,你不必使用硬编码字符串,只需要WHERE子句。
答案 1 :(得分:0)
这样的事情怎么样?
SELECT colA, colB, colC, date, SUM(value) FROM table
WHERE colC in ('thing 1', 'thing2')
GROUP BY colA, colB, colC, date