TSQL определить правильный день - PullRequest
1 голос
/ 14 апреля 2011

Вчера я обнаружил проблему с дизайном таблицы или запросом, из которого я извлекаю данные, и мне нужны некоторые рекомендации / предложения о том, как действовать и исправить мою проблему.

Моя таблица выглядит следующим образом:

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

Все это работает отлично.Таблица содержит около 300 тысяч записей, включая около 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.

Я ищу предложения о том, как решить эту проблему.Есть ли способ определить правильное количество дней?

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Вместо того, чтобы хранить DayCount и управлять им, можете ли вы вычислить количество дней между @BusinessDate и PostDate в вашем запросе?

0 голосов
/ 14 апреля 2011

Я, как правило, согласен с @ n8wrl, что DayCount, скорее всего, не должен храниться и должен рассчитываться на лету, но если это не вариант, то, по крайней мере, сделать его вычисляемым столбцом, где он представляет собой DATEDIFF междуPostDate и GETDATE () и избавиться от этого ночного процесса.Конечно, это все равно будет, по сути, обрабатывать его на лету, но я не думаю, что снижение производительности будет плохим, учитывая потенциальный риск того, что ночная работа не будет запущена или запущена дважды и т. Д.

Теперь, для срочной необходимости, вы можете просто сделать тест DayCount более динамичным, например:

WHERE (DayCount <= (5 + DATEDIFF(DAY, @BusinessDate, PostDate)))

Делая это, мы добавляем 1 к условию, чтобы DayCount <= 6 был вчерашним отборочныму записей теперь есть DayCount 6. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...