当我对 SQL (MSSQL) 还很陌生时,我正在重新审视我为报告编写的一些旧代码。它做了它应该做的事情,但它不是最漂亮或最有效的。
下面的虚拟代码模仿了我目前所拥有的。在这里,我试图计算过去 5 周内未平仓合约的数量。对于此示例,如果合同的开始日期发生在给定周之前或之后,并且结束日期发生在给定周期间或之后,则合同被认为是未结的。
dbo.GetWeekStart(@Date DATETIME, @NumOfWeeks INT, @FirstDayOfWeek CHAR(3)) 是一个函数,它将根据为指定周数提供的日期返回每周的第一天。即 SELECT * FROM dbo.GetWeekStart('20120719', -2, 'MON') 将返回 2012 年 7 月 19 日之前的 2 个星期一。
我怎样才能简化这个?我认为有人可以在没有循环的情况下执行此操作,但我无法弄清楚。
DECLARE @RunDate DATETIME,
@Index INT,
@RowCount INT,
@WeekStart DATETIME,
@WeekEnd DATETIME
DECLARE @Weeks TABLE
(
WeekNum INT IDENTITY(0,1),
WeekStart DATETIME,
WeekEnd DATETIME
)
DECLARE @Output TABLE
(
WeekStart DATETIME,
OpenContractCount INT
)
SET @RunDate = GETDATE()
INSERT INTO @Weeks (WeekStart, WeekEnd)
SELECT WeekStart,
DATEADD(ss,-1,DATEADD(ww,1,WeekStart))
FROM dbo.[GetWeekStart](@RunDate, -5, 'MON')
SET @RowCount = (SELECT COUNT(*) FROM @Weeks)
SET @Index = 0
WHILE @Index < @RowCount
BEGIN
SET @WeekStart = (SELECT WeekStart FROM @Weeks WHERE WeekNum = @Idx)
SET @WeekEnd = (SELECT WeekEnd FROM @Weeks WHERE WeekNum = @Idx)
INSERT INTO @Output (WeekStart, OpenContractCount)
SELECT @WeekStart,
COUNT(*)
FROM Contracts c
WHERE c.StartDate <= @WeekEnd
AND ISNULL(c.EndDate, GETDATE()) >= @WeekStart
SET @Index = @Index + 1
END
SELECT * FROM @Output