выравнивание таблиц с разными датами - PullRequest
0 голосов
/ 18 мая 2018

У меня есть две таблицы, которые называются tblDaily и tblWeekly.

Таким образом, tblDaily содержит ежедневные данные, а tblWeekly содержит данные, которые хранятся каждую пятницу.

Так что очевидно, что присоединиться к ежедневной таблице легкок еженедельной таблице, когда дата в ежедневных данных - пятница.

Мой вопрос - как лучше всего присоединиться, когда дата не пятница?Например, скажем, у меня была дата 2018-05-09 (среда). Я хотел бы присоединиться к ней в предыдущую пятницу (2018-05-04).Каков оптимальный способ сделать это?

Я читал о календарной таблице, это будет правильный путь?Хотя я не уверен, как это будет работать в этом случае?

   tblDaily
   date         val
   2018-04-30   2              'mon
   2018-05-01   3              'tues
   2018-05-02   3              'wed
   2018-05-03   3              'thurs
   2018-05-04   3              'fri
   2018-05-07   2              'mon
   2018-05-08   3              'tues
   2018-05-09   3              'wed
   2018-05-10   3              'thurs
   2018-05-11   3              'fri
   2018-05-14   3              'mon

   tblWeekly
   date         val
   2018-05-04   2              'fri
   2018-05-11   3              'fri

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Это может работать:

SELECT
    [dailydate] = D.[date],
    [dailyval] = D.[val],
    [weeklydate] = W.[date],
    [weeklyval] = W.[val]
FROM
    [tblDaily] AS D
    OUTER APPLY (SELECT TOP (1) _W.*
                 FROM [tblWeekly] AS _W
                 WHERE _W.[date] <= D.[date]
                 ORDER BY _W.[date] DESC) AS W;

Этот запрос дает следующие результаты:

dailydate   dailyval  weeklydate  weeklyval
2018-04-30  2         NULL        NULL
2018-05-01  3         NULL        NULL
2018-05-02  3         NULL        NULL
2018-05-03  3         NULL        NULL
2018-05-04  3         2018-05-04  2
2018-05-07  2         2018-05-04  2
2018-05-08  3         2018-05-04  2
2018-05-09  3         2018-05-04  2
2018-05-10  3         2018-05-04  2
2018-05-11  3         2018-05-11  3
2018-05-14  3         2018-05-11  3
0 голосов
/ 18 мая 2018

Попробуйте это просто join:

select *
from tblDaily [d]
--first condition in join is to match firdays exactly
left join tblWeekly [w] on [w].[date] = [d].[date] or
    --here you are joining fridays from tblWeekly to last friday before the date in tblDaily
    [w].[date] = dateadd(day, -datepart(weekday, [d].[date]) - 1, [d].[date])

Вот SQL скрипка .

0 голосов
/ 18 мая 2018

Попробуйте что-то вроде этого:

select * from tblDaily a join tblWeekly b on a.date1= dateadd(day,-5,b.date2)
...