python - 将查询结果附加到 PostgreSQL 中的同一结果行 - Redshift

标签 python mysql postgresql sqlalchemy amazon-redshift

我有一个表,有 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 中执行此操作?

编辑和开放问题: Redshift 中 string_agg() 的替代方案是什么(Postgres 8.0.2) - 有关上述用例的更多信息。

在使用 string_agg 时,我得到错误:函数 string_agg(text, "unknown") 不存在 提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换

编辑 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 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 分组是否可以?

最佳答案

PostgreSQL

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

编辑: 对于 9.0 之前(引入 STRING_AGG 时)甚至 8.4 之前(添加 ARRAY_AGG 时)的 PostgreSQL 版本,您可以创建自己的 custom aggregate function .

编辑2:对于8.0之前的版本(也许Amazon Redshift以某种方式基于PostgreSQL 7.4)不支持$$语法,因此函数体需要用引号引起来,并且引号内需要逃离 body 。

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/

相关文章:

PHP MySQL 按多列排序

r - 如何在 Greenplum/Postgres 中使用 PL/R 反序列化模型对象?

Python:重命名文件夹时参数无效

python - gammu.ERR_TIMEOUT - 树莓派

python - [Python][Tkinter]添加一个标志使标签的前景在循环中变成红色?

mysql - 在选择查询中使用变量

python - 在Python中读取传入的请求字符串

php - PDO 的 UPDATE 和 FETCHALL() 规则

python - SQLAlchemy:带有 load_only、order_by 和 limit 的无效 SQL

json - 为 Postgres JSON 文档生成 UUID