我昨天发现了一个问题,我的表格设计或我从中提取数据的查询,我需要一些关于如何处理和解决问题的指导/建议。
我的表格如下:
CREATE TABLE
[DT].[CountTotals](
[Acct] [varchar](8) NOT NULL,
[TCount] [smallint] NOT NULL ,
[TDate] [smalldatetime] NOT NULL,
[PostDate] [smalldatetime] NOT NULL ,
[DayCount] [tinyint] NULL ,
[AggCount] [smallint] NULL ,
[AggNumber] [numeric](10, 0) NULL,
[IsReadyToArchive] [bit] NOT NULL
)
我使用以下视图提取此数据:
CREATE VIEW [DT].[vwGetCountHistory]
AS
SELECT
C.Acct, C.TCount, C.TDate, C.PostDate
, C.DayCount, C.AggCount, C.AggNumber
FROM DT.CountTotals C
UNION
SELECT
AC.Acct, AC.TCount, AC.TDate, AC.PostDate
, AC.DayCount, AC.AggCount, AC.AggNumber
FROM ARCHIVE.DTA.CountTotals AC
所有这一切都很好。该表有大约300k条记录总记录,包括每天添加约5000条新记录,PostDate是添加记录的日期。我的问题来自DayCount字段 - 该字段每天在表中增加1,直到PostDate is < GetDate()-90
。我的问题在于以下查询:
SELECT
Acct
, SUM(AggCount) AS SumofAggCount
FROM DT.vwGetCountHistory
WHERE (DayCount <= 5)
AND
(
PostDate >= @BusinessDate - 90
AND PostDate <= @BusinessDate
)
GROUP BY Acct
HAVING (SUM(AggCount) >= 4)
如果我正在搜索当前日期,则此查询非常有效,因为DayCount是正确的。但是愚蠢的我忘记了他们可以搜索前几天的数据,所以我的DayCount自PostDate以来每天都会增加。
我正在寻找有关如何解决此问题的建议。有没有办法确定正确的日数?
答案 0 :(得分:1)
而不是存储&amp;管理DayCount,您可以在查询中计算@BusinessDate和PostDate之间的天数吗?
答案 1 :(得分:0)
我普遍同意@ n8wrl,DayCount很可能不会存储,应该动态计算,但如果这不是一个选项,那么至少要把它作为计算列,它是一个DATEDIFF之间的DATEDIFF PostDate和GETDATE()并摆脱那个夜间进程。当然,实际上,这仍然会在飞行中处理它,但我不认为由于夜间工作没有运行或运行两次等的潜在风险,性能损失会很差。
现在,您可以立即使DayCount测试更具动态性,例如:
WHERE (DayCount <= (5 + DATEDIFF(DAY, @BusinessDate, PostDate)))
这样做我们在条件中加1,以便它是DayCount&lt; = 6,因为昨天的合格记录现在的DayCount为6。