【问题标题】:Values across multiple rows brought into one row (separate cells) if rows have matching IDs. NULL values if ID only exists once如果行具有匹配的 ID,则将多行中的值合并为一行(单独的单元格)。如果 ID 只存在一次,则为 NULL 值
【发布时间】: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

【问题讨论】:

    标签: sql pivot window-functions


    【解决方案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 有一个或两个记录,如您的数据所示。

    【讨论】:

    • 这确实运行正常,并且产生了我正在寻找的东西,所以谢谢你!在理想情况下,我希望能够执行此操作而无需事先假设任何事情。
    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2023-04-03
    相关资源
    最近更新 更多