如果行具有匹配的 ID,则将多行中的值合并为一行(单独的单元格)。如果 ID 只存在一次,则为 NULL 值
Posted
技术标签:
【中文标题】如果行具有匹配的 ID,则将多行中的值合并为一行(单独的单元格)。如果 ID 只存在一次,则为 NULL 值【英文标题】:Values across multiple rows brought into one row (separate cells) if rows have matching IDs. NULL values if ID only exists once 【发布时间】:2020-08-21 21:03:20 【问题描述】:窗口函数相对较新,但我很确定这就是这里所需要的。我正在尝试将共享相同 ID/dense_rank 的数据集中返回的两行或多行合并为一行。
如果数据集中的 ID 在该表中没有匹配项,则会有 NULL 值。
查看我希望最终结果的样子以及我目前收到的结果。不确定是 row_number 还是dense_rank。谢谢! (以下查询)。
select
DENSE_RANK() OVER(ORDER BY l.unit_key) AS ID,
l.unit_key,
l.start_date,
u.area,
c.amount
from unit_rt u
join lease_rt l on u.unit_key = l.unit_key
join charges_rt c on l.lease_key = c.lease_key
【问题讨论】:
【参考方案1】:如果我没看错,您可以通过升序start_date
来加入和排列具有相同unit_key
的记录,然后使用条件聚合对结果集进行旋转:
select
unit_key,
max(case when rn = 1 then l.start_date end) prior_lease_date,
max(case when rn = 1 then u.area end) prior_area,
max(case when rn = 1 then c.amount end) prior_amount,
max(case when rn = 2 then l.start_date end) new_lease_date,
max(case when rn = 2 then u.area end) new_area,
max(case when rn = 2 then c.amount end) new_amount
from unit_rt u
inner join (
select
l.*,
row_number() over(partition by l.unit_key order by l.start_date) rn
from lease_rt l
) l on u.unit_key = l.unit_key
inner join charges_rt c on l.lease_key = c.lease_key
group by l.unit_key
请注意,这仅假定每个 unit_key
有一个或两个记录,如您的数据所示。
【讨论】:
这确实运行正常,并且产生了我正在寻找的东西,所以谢谢你!在理想情况下,我希望能够执行此操作而无需事先假设任何事情。以上是关于如果行具有匹配的 ID,则将多行中的值合并为一行(单独的单元格)。如果 ID 只存在一次,则为 NULL 值的主要内容,如果未能解决你的问题,请参考以下文章