我有一个表,有3列a、B、C—其中a不是主键。我们需要为每个不同的A选择B、C对(按A分组),并将结果附加到最终结果集的末尾。这在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中完成这项工作?
编辑开放式问题(&O):
在红移(Postgres 8.0.2)中,除了string_agg()之外,还有什么可供选择的呢?以上是关于用例的更多信息。
在使用字符串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函数本身?”错误:不支持CREATE函数“2013年的一个线程这么说forums.aws.amazon.com/thread.jspa?螺纹ID=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组是否可以?

最佳答案

PostgreSQL公司

SELECT
  a,
  STRING_AGG('(' || c || ',' || b || ')', ' ; ')
FROM
  tbl
GROUP BY
  a;

编辑:
对于9.0之前的PostgreSQL版本(引入STRING-AGG时)甚至8.4之前的版本(添加ARRAY-AGG时),您可以创建自己的custom aggregate function
编辑2:对于8.0之前的版本(可能Amazon Redshift是基于PostgreSQL 7.4的),不支持$$语法,因此需要将函数体括在引号中,并对正文中的引号进行转义。
CREATE FUNCTION cut_semicolon(text) RETURNS text AS '
BEGIN
  RETURN SUBSTRING($1 FROM 4);
END;
' LANGUAGE 'plpgsql' IMMUTABLE;


CREATE FUNCTION concat_semicolon(text, text) RETURNS text AS '
BEGIN
  RETURN $1 || '' ; '' || $2;
END;
' LANGUAGE 'plpgsql' IMMUTABLE;

CREATE AGGREGATE concat_semicolon(
  BASETYPE=text,
  SFUNC=concat_semicolon,
  STYPE=text,
  FINALFUNC=cut_semicolon,
  INITCOND=''
);

然后改用那个聚合。
SELECT
  a,
  CONCAT_SEMICOLON('(' || c || ',' || b || ')')
FROM
  tbl
GROUP BY
  a;

MySQL数据库
SELECT
  a,
  GROUP_CONCAT(CONCAT('(', c, ',', b, ')') SEPARATOR ' ; ')
FROM
  tbl
GROUP BY
  a;

关于python - 将查询结果追加到PostgreSQL中的相同结果行-Redshift,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27122670/

10-16 22:57