如果行具有匹配的 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 值的主要内容,如果未能解决你的问题,请参考以下文章

如果间隔小于 5 秒,则将多行合并为一行

如果行不存在具有相同的值,如何在 Mysql 中插入行

如果行中的指定值与条件匹配,则从 CSV 返回一行

如何在 Microsoft SQL Server Management Studio 中将多行合并为一行,用逗号分隔

如何用sql语句将多行合并成一行

聚合函数将多行中的值汇总到一个结果行中