SQL.Как расширить таблицу, используя дату? - PullRequest
0 голосов
/ 07 ноября 2010

Я использую SQL 2008.

У меня есть логическая сущность (таблица), скажем, Data с атрибутами (столбцы) (ключ, дата, a, b, c, d).

theПроблема в том, что a и b меняют значения каждый день, а c и d меняют значения в случайные даты и очень медленно.А также они меняются для каждого ключа индивидуально.Скажем, c, d для ключа = 1 изменится сегодня и в следующем месяце, а для ключа = 2 завтра и через неделю.

Так что моя идея - разделить на 2. MainData (ключ, дата, a, b)и TemporalData (key, changeDate, c, d)

Однако мне не удалось написать эффективный запрос - как его использовать.

Я думал о несколько «параметризованном» представлении (не уверенесли это вообще возможно).Скажем, выберите * из vwData, где date = 'xxxxx', и он вернет мне a, b для этого конкретного дня, а также c, d, которые действовали для определенного ключа и этой даты.

Мне нужнопростой и понятный способ выбора данных из этой конструкции.Мне также нужно, чтобы он был эффективным, так как данные за год будут огромными

(Примечание: выбор будет только в том случае, если дата = @singleDate никогда не будет датой между)

Пример:

MainData             TemporalData
1 20101001 1.0 2.0   1 20101001 2.0 3.0
1 20101002 2.0 3.0   1 20101003 8.0 9.0
1 20101003 4.0 5.0   
1 20101004 6.0 3.0   

 select * from vwData where date = '20101002'

 1 20101002 2.0 3.0 2.0 3.0

 select * from vwData where date = '20101003'

 1 20101003 4.0 5.0 8.0 9.0

 select * from vwData where date = '20101004'

 1 20101004 6.0 3.0 8.0 9.0

1 Ответ

1 голос
/ 07 ноября 2010

Во-первых, разбиение данных на соотношение 1: 1 с большим количеством статических данных в одной таблице и данными, которые часто изменяются в другой таблице, - неплохой подход.Во-вторых, не ясно, должен ли TemporalData.ChangeDate соответствовать MainDate. [Date].Если предположить, что это так, то вы можете сделать что-то вроде этого:

Select MainData.Key, MainData.[Date], MainData.a, MainData.b
    , TemporalData.c, TemporalData.d
From MainData
    Left Join TemporalData
        On TemporalData.Key = MainData.Key
            And TemporalData.ChangeDate = MainDate.[Date]
Where MainData.[Date] = @SomeDate

Это предполагает, что у вас всегда будут значения MainData, но могут не быть значения TemporalData.Вы можете поместить это в представление, но не можете указать параметр.Представление является виртуальной таблицей и, как таковое, представляет собой неупорядоченный набор строк.Таким образом, ваше представление будет выглядеть так:

Create View vwMain 
As
Select MainData.Key, MainData.[Date], MainData.a, MainData.b
    , TemporalData.c, TemporalData.d
From MainData
    Left Join TemporalData
        On TemporalData.Key = MainData.Key
            And TemporalData.ChangeDate = MainDate.[Date]

Затем вы будете использовать представление следующим образом:

Select ...
From vwMain
Where [Date] = @SomeDate

РЕДАКТИРОВАТЬ

Это будетПохоже, что вы хотите всегда иметь строку TemporalData, представляющую самую последнюю дату.Это не ясно из вашего описания, хотя мы можем вывести его из ваших комментариев и примеров вывода.Итак, учитывая это, вот решение.Очевидно, что конечный результат не будет включать выражения общей таблицы для исходных данных примера:

With MainData As
    (
    Select 1 As [Key], '20101001' As [Date], 1.0 As A, 2.0 As B
    Union All Select 1 As [Key], '20101002', 2.0, 3.0
    Union All Select 1 As [Key], '20101003', 4.0, 5.0
    Union All Select 1 As [Key], '20101004', 6.0, 3.0
    )
    , TemporalData As
    (
    Select 1 As [Key], '20101001' As [ChangeDate], 2.0 As C, 3.0 As D
    Union All Select 1 As [Key], '20101003', 8.0, 9.0
    )
    , RankedResults As
    (
    Select MainData.[Key], MainData.[Date], MainData.a, MainData.b
        , TemporalData.c, TemporalData.d, TemporalData.ChangeDate
        , Row_Number() Over ( Partition By MainData.[Key], MainData.[Date]
                          Order By TemporalData.ChangeDate Desc ) As Num
    From MainData
        Join TemporalData
            On TemporalData.Key = MainData.Key
               And TemporalData.ChangeDate <= MainData.[Date]
    )
Select *
From RankedResults
Where Num = 1
Order By [Date]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...