根据 10 天过滤器生成 SQL 行号

Posted

技术标签:

【中文标题】根据 10 天过滤器生成 SQL 行号【英文标题】:Generate the SQL row numbers based on the 10 days filters 【发布时间】:2020-09-03 08:41:04 【问题描述】:
 Customer_Id        Call_Date             Agent_M_Code    Row_Indicator
 810471698    2020-03-19 13:25:24.910       rmanzan2           1
 810471698    2020-03-22 20:28:19.067       pmaclair           2
 810471698    2020-03-24 09:22:47.833       njeanle            3
 810471698    2020-03-24 12:36:29.367       edelaro4           4
 810471698    2020-03-29 22:36:29.762       kdularo7           1
 810471698    2020-04-11 11:21:11.243       rbustam1           1
 810471698    2020-04-11 17:50:41.023       frenteri           2
 810471698    2020-05-10 11:16:21.683       cschuch2           1
 810471698    2020-05-13 15:26:40.660       gledesma           2
 810471698    2020-07-03 11:26:20.697       cmataver           1
 810471698    2020-07-22 14:19:53.450       irodri13           1

对于上表,我需要生成row_indicator,但这里的条件是......如果上面的Call_Date和下面的call_Date在10天之间,那么我们需要按顺序生成row_indicator,即(1,2,3, 4..) 如果没有,我们需要从 1 开始。

例如: 在上面的示例表中,前四行介于 10 天之间(小于或等于 240 小时),那么前四行的 row_indicators 为 1,2,3 ,4 再次从第五行开始,Call_Date 从 1 开始,因为第五行日期不在 10 天 Call_Date 范围内。

【问题讨论】:

那么,您的问题是什么?你没有问任何问题,所以我们无法回答。 尝试了什么,为什么没有成功? 到目前为止你尝试了什么? 我已经尝试使用 LEAD() 和 Partition by Order by Clause ......但我只能将 row_numbers() 生成到表中。谢谢@GMB :) 您的代码适用于这种情况......很好的答案。再次感谢 GMB 的敏锐和有效。 欢迎@venugopal。如果我的回答正确地回答了您的问题,那么点击复选标志accept it...谢谢! 【参考方案1】:

为此,您需要一个递归查询。这个想法是通过升序call_date 迭代遍历表格,同时跟踪每个日期的“第一个”记录。只要一行比初始日期晚 10 天以上,该值就会重置。

with 
    data as (select t.*, row_number() over(order by call_date) rn from mytable t),
    cte as (
        select d.*, call_date initial_date from data d where rn = 1
        union all
        select d.*, 
            case when d.call_date > dateadd(day, 10, c.initial_date) 
                then d.call_date
                else c.initial_date
            end
        from cte c
        inner join data d on d.rn = c.rn + 1
    )
select customer_id, call_date, agent_m_code, 
    row_number() over(partition by initial_date order by call_date) row_indicator
from cte
order by call_date

【讨论】:

以上是关于根据 10 天过滤器生成 SQL 行号的主要内容,如果未能解决你的问题,请参考以下文章

如何使用窗口函数根据奇偶行号过滤掉结果,没有现有列作为行ID

按行号过滤数组数组

获取 ASP.NET Core 中发生异常的行号

过去 7 天 Unix/Redshift 过滤器不工作

windows下如何过滤CMD的命令结果(按行号过滤)

Linux 命令