【问题标题】:SQL max and min dates with filter带有过滤器的 SQL 最大和最小日期
【发布时间】:2018-10-09 18:12:32
【问题描述】:

以下帐户于 2018 年 1 月 19 日关闭,然后于 2018 年 2 月 27 日重新打开,然后于 2018 年 3 月 26 日再次关闭。当这个帐户被打开和关闭时,我如何编写 sql 来捕获。 closerestrictind = 'C' 是帐户关闭的时间。

我们在一个数据仓库中工作,每天都会加载数据以捕获所有历史记录。

帐户 1234 应如下所示:

closed on 1/19/2018
re-opened on 2/27/2018
closed on 3/26/2018

谢谢!

【问题讨论】:

  • 请添加您正在使用的 SQL Server 版本。还有预期的结果。
  • 如果有'C'的行表示已关闭,怎么开户不止一次?
  • SQL 2014 - 同一个客户,所以如果客户决定回来,我们会重复使用同一个帐号。
  • 谷歌“差距和岛屿问题”,你会发现很多解决这个常见问题的例子。
  • 开放日期和到期日期列是否有隐藏含义?例如,打开请求发生在关闭的到期日期结束之前?

标签: sql sql-server tsql sql-server-2014


【解决方案1】:

你可以使用lag():

select acctnbr, effectivedate,
       (case when closerestrictedind = 'C' then 'closed' else 'opened' end) as action
from (select t.*, lag(closerestrictedind) over (partition by acctnbr order by effectivedate) as prev_cr
      from t
     ) t
where prev_cr <> closerestrictedind;

【讨论】:

  • 谢谢!这很好用!我必须开始更多地使用这个 LAG 功能。
【解决方案2】:

你可以做两个 select 语句,第一个带有 row_number() 按 acctnbr 分区,按日期排序...保存在 tmp 表中

第二次选择,将这个表与自身内联,t1和t2。

其中 t1.closerestrictedind = 'C'

而连接 where t1.rownum > t2.rownum +1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多