带过滤器的SQL最大和最小日期

时间:2018-10-09 18:12:33

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

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

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

对于acct 1234应该看起来像这样:

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

enter image description here

谢谢!

2 个答案:

答案 0 :(得分:5)

您可以使用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;

答案 1 :(得分:0)

您可以执行两个选择语句,第一个通过acctnbr进行row_number()分区,按日期排序...将其保存在tmp表中

第二个选择,内部将此表与t1和t2自身连接。

其中t1.closerestrictedind ='C'

和连接,其中t1.rownum> t2.rownum +1