sql在周​​末和节假日重复行

时间:2018-10-23 11:36:47

标签: sql sql-server

我有一个表A,我们根据它降落在某天的日期来导入该表。我们在周末和公共假期不接收文件,并且该表包含多个国家/地区的数据,因此公共假期会有所不同。本质上,我们希望多次复制一行,直到遇到该ID的下一条记录(除非该ID的最大日期)。典型的记录如下所示:

Account Datekey Balance
1   20181012    100
1   20181112    100
1   20181212    100
1   20181512    100
1   20181712    100

并且需要看起来像这样(添加了星期六,星期日和PH以指示星期几):

Account Datekey Balance 
1   20181012    100 
1   20181112    100 
1   20181212    100 
1   20181312    100 Sat
1   20181412    100 Sun
1   20181512    100 
1   20181612    100 PH
1   20181712    100 

日期键也是数字而不是日期。我尝试了几种建议的解决方案,但发现它只是重复多次重复了上一行而在找到下一个日期记录时不停止。我需要将其作为更新查询运行,每天在表A上执行,并在执行时添加丢失的记录(有时2或3天后)。

希望您能提供帮助。

谢谢

1 个答案:

答案 0 :(得分:4)

此问题包括多个部分:

  • 将淫秽日期格式转换为日期
  • 生成“中间”行
  • 使用先前的值填充新行
  • 确定星期几

以下大部分操作。我拒绝重新生成datekey格式。您确实需要解决该问题。

这还假设您的设置是针对英文工作日名称的。

with t as (
      select Account, Datekey, Balance, convert(date, left(dkey, 4) + right(dkey, 2) + substring(dkey, 5, 2)) as proper_date
      from yourtable
     ),
     dates as (
      select account, min(proper_date) as dte, max(proper_date) as max_dte
      from t
      group by account
      union all
      select account, dateadd(day, 1, dte), max_dte
      from dates
      where dte < max_dte
     )
select d.account, d.dte, t.balance,
       (case when datename(weekday, d.dte) in ('Saturday', 'Sunday')
             then left(datename(weekday, d.dte), 3)
             else 'PH'
        end) as indicator
from dates d cross apply
     (select top (1) t.*
      from t
      where t.account = d.account and
            t.proper_date <= d.dte
      order by t.proper_date desc
     ) t
option (maxrecursion 0);