我所做的每一次搜索都会让我找到寻找 array_agg 以将一行中的多个列组合成列的人的结果。这不是我在这里想要弄清楚的,也许我没有使用正确的搜索词(例如,合并、合并、合并)。
我正在尝试通过在字段中填充值来组合行...除了示例之外,我不确定描述此问题的最佳方式:
Current:
--------------------------------
id num_1 num_2 num_3 num_4
--------------------------------
1 111 222 0 0
2 111 333 0 0
3 111 0 0 444
4 0 222 555 0
5 777 999 0 0
6 0 999 888 0
After Processing:
--------------------------------
id num_1 num_2 num_3 num_4
--------------------------------
1 111 222 555 444
2 111 333 555 444
3 111 333 555 444
4 111 222 555 444
5 777 999 888 0
6 777 999 888 0
After Deleting Duplicate Rows:
--------------------------------
id num_1 num_2 num_3 num_4
--------------------------------
1 111 222 555 444
2 111 333 555 444
3 777 999 888 0
这可能是一个两步过程……首先填写空白,然后查找/删除重复项。我可以执行第二步,但无法弄清楚如何首先使用另一行中的值填充 0 值,您可能有两个不同的值(num_2
列的 id 1/2)但只有一个值对于 num_1
(例如 111)
我可以用 PHP 完成,但想知道如何只使用 Postgres 来完成。
编辑:我的示例表是一个关系表。我有多个具有相似信息(例如用户名)但注册 ID 号不同的数据集。因此,我在用户名相同的表 1 和表 2(例如)上进行了内部联接。然后我从每个表中获取注册 ID(不同的)并将其作为一行插入到我的关系表中。在我上面的示例表中,第 1 行有两个不同的注册 ID 来 self 加入的两个表......值 111 (num_1
) 和 222 (num_2
) 被插入到表中以及为 num_3
和 num_4
插入的零。然后我比较表 1 和表 4,值 111 (num_1
) 和 444 (num_4
) 被插入到关系表中,并且 num_2
为零> 和 num_3
。由于注册 ID 111 与注册 ID 222 相关,而注册 ID 111 与注册 ID 444 相关,因此注册 ID 111、222 和 444 都是相关的(这意味着每个注册 ID 的用户名都相同)。这有助于澄清吗?
编辑 2: 我更正了表 2 和表 3。希望现在它有意义了。用户名列不是唯一的。所以,我有 4 个这样的表:
表 1:
bob - 111
mary - 777
表 2:
bob - 222
bob - 333
mary - 999
表 3:
bob - 555
mary - 888
表 4:
bob - 444 -- mary does not exist in this table
因此,在我的关系表中,我应该以上面示例表 3 中给出的 3 行结束。
最佳答案
您似乎是从假定的解决方案中间开始的,忘记了提出最初的问题。根据您添加的信息,我建议一个完全不同的、更简单的解决方案。你有:
CREATE TABLE table1 (username text, registration_id int);
CREATE TABLE table2 (LIKE table1);
CREATE TABLE table3 (LIKE table1);
CREATE TABLE table4 (LIKE table1);
INSERT INTO table1 VALUES ('bob', 111), ('mary', 777);
INSERT INTO table2 VALUES ('bob', 222), ('bob', 333), ('mary', 999);
INSERT INTO table3 VALUES ('bob', 555), ('mary', 888);
INSERT INTO table4 VALUES ('bob', 444); -- no mary
解决方案
您真正似乎需要的是FULL [OUTER] JOIN
。手册中的详细信息 FROM
和 JOIN
.
-- CREATE TABLE relations AS
SELECT username
, t1.registration_id AS reg1
, t2.registration_id AS reg2
, t3.registration_id AS reg3
, t4.registration_id AS reg4
FROM table1 t1
FULL JOIN table2 t2 USING (username)
FULL JOIN table3 t3 USING (username)
FULL JOIN table4 t4 USING (username)
ORDER BY username;
就是这样。直接产生您想要的结果。
username reg1 reg2 reg3 reg4
---------------------------------
bob 111 222 555 444
bob 111 333 555 444
mary 777 999 888 (null)
您给出的示例也适用于 LEFT JOIN
,因为所有缺失的条目都在右侧。但这在其他星座中会失败。我在 fiddle 中添加了一些更具启发性的测试用例:
我假设您知道多个表中的多个条目会产生大量输出行:
关于sql - 合并、组合、合并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34830693/