Sql 如何将组中的行与合并
我有一个场景,需要通过比较不同的列来合并行 下面是一个复杂联接的结果示例 输入Sql 如何将组中的行与合并,sql,Sql,我有一个场景,需要通过比较不同的列来合并行 下面是一个复杂联接的结果示例 输入 keycolumn val1 val2 a abc a xyz a abc a xyz a pqr 期望结果 keycolumn val1 val2 a
keycolumn val1 val2
a abc
a xyz
a abc
a xyz
a pqr
期望结果
keycolumn val1 val2
a abc abc
a xyz xyz
a pqr
我想看看是否可以在不使用join的情况下获得所需的结果您可以使用self-
左join
匹配keycolumn
和val1/val2
元组的表,并使用DISTINCT
和COALESCE()
打印相关值:
SELECT DISTINCT
t1.keycolumn,
COALESCE(t1.val1, t2.val1) val1,
COALESCE(t1.val2, t2.val2) val2
FROM mytable t1
LEFT JOIN mytable t2
ON t1.keycolumn = t2.keycolumn
AND (t1.val1 = t2.val2 OR t1.val2 = t2.val1)
:
| keycolumn | val1 | val2 |
| --------- | ---- | ---- |
| a | abc | abc |
| a | xyz | xyz |
| a | pqr | |
您可以使用
union all
和group by
:
select keycolumn, max(val1) as val1, max(val2) as val2
from ((select t.keycolumn, t.val1, null as val2, row_number() over () as seqnum
from t
where val1 is not null
) union all
(select t.keycolumn, null as val1, t.val2, row_number() over () as seqnum
from t
where val2 is not null
)
) t
group by keycolumn, seqnum
order by keycolumn, seqnum;
他是一把小提琴。根据数据库的不同,对于行号()
(db fiddle使用Postgres,不需要order by
),您可能需要order by
。您可以尝试以下方法:
select t1.keycolumn, t1.val1,
(select t2.val2 from table1 t2 where t2.keycolumn = t1.keycolumn and t2.val2 = t1.val1)
from table1 t1
where t1.val1 is not null
我们如何判断哪些记录应分组在一起?应使用keycolumn进行分组,如果一条记录中的val1值位于另一条记录的val2列中,或者反之亦然,则它们应显示为单个记录,而不是2条记录。如果不存在相应的记录,我们该怎么办?如果不存在记录,则相应的值将为null,但这两列中的一列将始终有一个值。