我想根据下面的col c
组合行,并将它们的value
列数据相加。行按照它们的组合方式进行颜色编码。
这需要发生在col a
col b
和date
字段匹配的情况下,它只能发生在col c
='thing 1'或'thing 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;
但这并没有让我得到我期待的总结。此外,聚合本身会从输出中删除我仍然需要的列(例如上面未突出显示的行)。我只需要合并彩色行,其他所有行保持不变。
你可以选择你的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子句。
这样的事怎么样?
SELECT colA, colB, colC, date, SUM(value) FROM table
WHERE colC in ('thing 1', 'thing2')
GROUP BY colA, colB, colC, date