Microsoft SQL Server“DENSE LAG()”

问题描述 投票:0回答:1

我人为地将我们拥有的每个用户 ID 的一堆假设的未来呼叫插入到通话历史记录数据库中,如图所示,我希望它是清楚的。

call_numbered 显然是用dense_rank() 函数排序的。

嗯,我试图为每个“未来的呼叫”提供最后一个“真实”的呼叫。 是否可以使用我可能不知道的一些复杂的窗口函数语法来做到这一点?

我在 case 语句中使用 first_value() 解决了这个问题,但它在代码中造成了很多混乱,并且它不能推广到其他情况。

我正在尝试寻找更优雅的解决方案来达到“最后真实”的调用值。

有人有什么想法吗?

sql-server window-functions dense-rank
1个回答
0
投票
select d.user_id, call_date, status,
    dense_rank() over(partition by user_id order by coalesce(hypo_call_date,call_date)) as call_number
from (
    select d.*, 
        case status when 'Hypothetical' then
            min(case status when 'Hypothetical' then call_date end) over(partition by user_id, status order by call_date) 
        end as hypo_call_date       
    from data d
) d
;

请注意,如果您在“真实看涨”上使用 MAX,则所有“hypo”都将具有最新“真实”的排名,而在“Hypo”上使用 MIN,它们将具有“+1”,如您的图片所示。

© www.soinside.com 2019 - 2024. All rights reserved.