我有一个表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天后)。
希望您能提供帮助。
谢谢
答案 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);