【发布时间】:2015-01-23 05:13:45
【问题描述】:
我有一个表,有 3 列 A, B , C - 其中 A 不是主键。我们需要为每个不同的 A(按 A 分组)选择 B、C 对,并将结果附加到最终结果集的末尾。这在sql中可以吗?
A | B | C
a1| b1| c1
a1| b2| c2
a1| b3| c3
a2| b1| c2
a2| b2| c5
我需要得到
a1 | (c1,b1) ; (c2,b2);(c3;b3)
a2 | (c2,b1) ; (c5,b2)
作为末尾附加的行。 我通常通过 sqlalchemy 执行此操作,然后最终在 Python 中转换数据,有没有一种方法可以直接在 SQL 中执行此操作?
编辑并提出问题: 什么是红移(Postgres 8.0.2)中 string_agg() 的替代方法 - 有关上述用例的更多信息。
使用 string_agg 我得到ERROR: function string_agg(text, "unknown") does not exist Hint: No function matches the given name and argument types. You may need to add explicit type casts
编辑2:使用自定义聚合函数添加错误
An error occurred when executing the SQL command:
CREATE FUNCTION cut_semicolon(text) RETURNS text AS $$
BEGIN
RETURN SUBSTRING($1 FROM 4)
ERROR: unterminated dollar-quoted string at or near "$$
BEGIN
RETURN SUBSTRING($1 FROM 4)"
Position: 53
CREATE FUNCTION cut_semicolon(text) RETURNS text AS $$
^
Execution time: 0.24s
(Statement 1 of 7 finished)
0 rows affected
END executed successfully
Execution time: 0.22s
(Statement 2 of 7 finished)
An error occurred when executing the SQL command:
$$ LANGUAGE 'plpgsql' IMMUTABLE
ERROR: unterminated dollar-quoted string at or near "$$ LANGUAGE 'plpgsql' IMMUTABLE"
Position: 1
$$ LANGUAGE 'plpgsql' IMMUTABLE
^
Execution time: 0.22s
(Statement 3 of 7 finished)
An error occurred when executing the SQL command:
CREATE FUNCTION concat_semicolon(text, text) RETURNS text AS $$
BEGIN
RETURN $1 || ' ; ' || $2
ERROR: unterminated dollar-quoted string at or near "$$
BEGIN
RETURN $1 || ' ; ' || $2"
Position: 62
CREATE FUNCTION concat_semicolon(text, text) RETURNS text AS $$
^
Execution time: 0.22s
(Statement 4 of 7 finished)
0 rows affected
END executed successfully
Execution time: 0.22s
(Statement 5 of 7 finished)
An error occurred when executing the SQL command:
$$ LANGUAGE 'plpgsql' IMMUTABLE
ERROR: unterminated dollar-quoted string at or near "$$ LANGUAGE 'plpgsql' IMMUTABLE"
Position: 1
$$ LANGUAGE 'plpgsql' IMMUTABLE
^
Execution time: 0.22s
(Statement 6 of 7 finished)
An error occurred when executing the SQL command:
CREATE AGGREGATE concat_semicolon(
BASETYPE=text,
SFUNC=concat_semicolon,
STYPE=text,
FINALFUNC=cut_semicolon,
INITCOND=''
)
ERROR: SQL command "CREATE AGGREGATE concat_semicolon(
BASETYPE=text,
SFUNC=concat_semicolon,
STYPE=text,
FINALFUNC=cut_semicolon,
INITCOND=''
)" not supported.
Execution time: 0.23s
(Statement 7 of 7 finished)
5 statements failed.
Script execution finished
Total script execution time: 1.55s
还浏览了 Google 群组中的相关答案,&看起来像是替换了分隔符“;”可能有帮助? - 虽然我不确定,哪个;在这个函数定义中替换。 参考:https://groups.google.com/forum/#!topic/sql-workbench/5LHVUXTm3BI
编辑 3: 也许,Redshift 不支持创建函数本身? “错误:不支持 CREATE FUNCTION”一个 2013 年的帖子这样说 forums.aws.amazon.com/thread.jspa?threadID=121137
编辑 4:
select A, concat(concat(concat(C, ',' ) , cast(B as varchar)), ',')
from my_table
group by A,B,C
-- Is it ok to group by all A,B, C - since I can't group by A alone, which removes the related "C" columns--
gives -:
a1 c1b1b2b3
a2 c2b1b2
但不是 C 的所有条目(以及分号)
a1 c1,b1;c2,b2;c2,b3
a2 c2,b1;c5,b2
但我想要中间的逗号 & 还需要知道 A、B、C 的分组是否可以?
【问题讨论】:
-
在发出简单的
select A, B, C from table之后,您不想在应用程序级别计算这类东西的任何特殊原因? -
@Denis 在工作中也被多次问过这个问题。我将此任务用作数据准备的一个步骤,我要做的最后一件事是在 redshift 中进行部分数据准备 - 处理它python,将其加入红移表中,然后进行其余的数据准备。看起来这将是最好的镜头?此外,在 Python 中,当我获取记录时,所有“相关”记录都必须适合内存,这就是为什么我的整个数据必须适合 - 让我能够处理要转换为单行的相关行(草率的原因),这一直促使我在红移中解决它。我使用数据框来存储 A、B 和 c 列
-
我昨天添加了一个更长的答案,这解释了为什么您无法在 Redshift 中做您想要的事情。顺便说一句,不要忘记在处理大型集合时可以使用游标(和临时表)来减少内存使用量。而且,描述更完整的问题(在一个单独的问题中,以避免使当前答案无关紧要)很可能会产生一个您甚至没有考虑过的解决方案。
标签: python mysql postgresql sqlalchemy amazon-redshift