我在这里有一个小的开发挑战。我在SQL Server中有以下表CURR_RATES
:
SELECT *
FROM (VALUES
(1001300, 'USD', 13, '8/1/2013', 1.31),
(1001301, 'USD', 13, '8/2/2013', 1.32),
(1001302, 'USD', 13, '8/5/2013', 1.33),
(1001303, 'USD', 13, '8/6/2013', 1.34),
(1001304, 'USD', 13, '8/7/2013', 1.35),
(1001305, 'USD', 13, '8/8/2014', 1.31),
(1001306, 'USD', 13, '8/9/2013', 1.32),
(1001307, 'USD', 13, '8/12/2013', 1.33),
(1001308, 'USD', 13, '8/13/2013', 1.34),
(1001309, 'USD', 13, '8/14/2013', 1.35),
(1001310, 'USD', 13, '8/15/2013', 1.36),
(1001311, 'USD', 13, '8/16/2013', 1.37),
(1001312, 'USD', 13, '8/19/2013', 1.38),
(1001313, 'USD', 13, '8/20/2013', 1.38),
(1001314, 'USD', 13, '8/21/2013', 1.37),
(1001315, 'USD', 13, '8/22/2013', 1.36),
(1001316, 'USD', 13, '8/23/2013', 1.35),
(1001317, 'USD', 13, '8/26/2013', 1.34),
(1001318, 'USD', 13, '8/27/2013', 1.33),
(1001319, 'USD', 13, '8/28/2013', 1.31),
(1001320, 'USD', 13, '8/29/2013', 1.32),
(1001321, 'USD', 13, '8/30/2013', 1.33)) as t(DATA_ID, CURR, CODE, [DATE], [RATE])
使用范围,例如2013-08-01至2013-08-31,我需要查找哪些天数=星期六和星期日(周末)。我可以使用datename(dw,CURR_RATES.DATE)函数轻松完成此操作。
datename(dw, CURR_RATES.DATE) as weekday from CURR_RATES
DATA_ID CURR CODE DATE RATE Weekday
----------- ---- ----------- --------- ----- -----------
1001300 USD 13 8/1/2013 1.31 Thursday
1001301 USD 13 8/2/2013 1.32 Friday
1001302 USD 13 8/5/2013 1.33 Monday
1001303 USD 13 8/6/2013 1.34 Tuesday
1001304 USD 13 8/7/2013 1.35 Wednesday
1001305 USD 13 8/8/2014 1.31 Friday
1001306 USD 13 8/9/2013 1.32 Friday
1001307 USD 13 8/12/2013 1.33 Monday
1001308 USD 13 8/13/2013 1.34 Tuesday
1001309 USD 13 8/14/2013 1.35 Wednesday
1001310 USD 13 8/15/2013 1.36 Thursday
1001311 USD 13 8/16/2013 1.37 Friday
1001312 USD 13 8/19/2013 1.38 Monday
1001313 USD 13 8/20/2013 1.38 Tuesday
1001314 USD 13 8/21/2013 1.37 Wednesday
1001315 USD 13 8/22/2013 1.36 Thursday
1001316 USD 13 8/23/2013 1.35 Friday
1001317 USD 13 8/26/2013 1.34 Monday
1001318 USD 13 8/27/2013 1.33 Tuesday
1001319 USD 13 8/28/2013 1.31 Wednesday
1001320 USD 13 8/29/2013 1.32 Thursday
1001321 USD 13 8/30/2013 1.33 Friday
我需要做的是编写一个存储过程来查找丢失的星期六和星期日,并为它们插入行,将列RATE的值设置为等于上一个星期五。该表可以包含其他月份的数据,因此我需要能够指定范围。此外,DATA_ID列需要包含新添加的行的值。对于第一个插入的行,DATA_ID列的值应该是最后一行的值DATA_ID +1 - 第二个插入的行应该是新插入的行+1的DATA_ID,依此类推....所以SP需要找出表格中最后一行的DATA_ID。
希望这很清楚 - 会对如何实现这一点的任何反馈或想法表示赞赏。
非常感谢你。
R00ty
答案 0 :(得分:1)
您可能需要修改case
中的dbo.BuildDateRange
以调整服务器的配置方式(SET DATEFIRST
)
一个函数,用于构建日期范围之间所有日期的表格: -
create function dbo.BuildDataRange
(
@StartDate date,
@EndDate date
)
returns @returntable table
(
[Date] date,
PreviousFriday date
)
as
begin
while @StartDate<=@EndDate begin
insert into @returntable ([Date],PreviousFriday)
values (
@StartDate,
dateadd(d,
case datepart(dw,@StartDate)
when 1 then -2
when 2 then -3
when 3 then -4
when 4 then -5
when 5 then -6
when 6 then -7
when 7 then -1
end,@StartDate)
)
set @StartDate=DATEADD(day,1,@StartDate)
end
return
end
go
测试数据表: -
create table #curr_rates (
data_id int,
curr char(3),
code int,
[date] datetime,
rate decimal(10,5)
)
go
包含一些数据: -
insert into #curr_rates values
(1001299,'usd',13,'2013-07-31',1.25),
(1001300,'usd',13,'2013-08-01',1.31),
(1001301,'usd',13,'2013-08-02',1.32),
(1001302,'usd',13,'2013-08-05',1.33),
(1001303,'usd',13,'2013-08-06',1.34),
(1001304,'usd',13,'2013-08-07',1.35),
(1001305,'usd',13,'2013-08-08',1.31),
(1001306,'usd',13,'2013-08-09',1.32),
(1001307,'usd',13,'2013-08-12',1.33),
(1001308,'usd',13,'2013-08-13',1.34),
(1001309,'usd',13,'2013-08-14',1.35),
(1001310,'usd',13,'2013-08-15',1.36),
(1001311,'usd',13,'2013-08-16',1.37),
(1001312,'usd',13,'2013-08-19',1.38),
(1001313,'usd',13,'2013-08-20',1.38),
(1001314,'usd',13,'2013-08-21',1.37),
(1001315,'usd',13,'2013-08-22',1.36),
(1001316,'usd',13,'2013-08-23',1.35),
(1001317,'usd',13,'2013-08-26',1.34),
(1001318,'usd',13,'2013-08-27',1.33),
(1001319,'usd',13,'2013-08-28',1.31),
(1001320,'usd',13,'2013-08-29',1.32),
(1001321,'usd',13,'2013-08-30',1.33)
go
SP插入缺失的数据(将填补上周五费率的任何空白,因此请确保只有周末缺失......
create procedure dbo.InsertWeekends
(
@from date,
@to date
) as
begin
declare @watermark int
select @watermark=max(data_id)
from #curr_rates
insert into #curr_rates
select @watermark+ROW_NUMBER() over(order by dr.[date]) as data_id,
cr.curr,
cr.code,
dr.[date],
cr.rate
from dbo.BuildDataRange(@from,@to) dr
join #curr_rates cr on cr.date=dr.PreviousFriday
where not exists(
select *
from #curr_rates csq
where csq.[date]=dr.[Date]
and csq.curr=cr.curr
and csq.code=cr.code
)
end
go
用法: -
exec dbo.InsertWeekends '2013-08-01', '2013-08-31'
go
这样: -
select *
from #curr_rates
order by [date]
go
生产: -