Выполнить запрос диапазона дат из одной контрольной таблицы столбцов (SQL Server) - PullRequest
1 голос
/ 23 марта 2012

Допустим, у меня есть следующие таблицы

TABLEA

seq datea
1   2010-01-01
2   2010-02-01
3   2010-03-01

TableB

dateb      sthvalue
2010-01-11 AAA
2010-01-12 AAB
2010-02-03 CCC
2010-02-06 CCD
2010-02-10 CCE
2010-03-05 FFF

Я хочу объединить две таблицы на tableb.dateb в пределах диапазона дат tablea

т.е. вывод должен быть

seq datea      dateb      sthvalue
1   2010-01-01 2010-01-11 AAA
1   2010-01-01 2010-01-12 AAB
2   2010-02-01 2010-02-03 CCC
2   2010-02-01 2010-02-06 CCD
2   2010-02-01 2010-02-10 CCE
3   2010-03-01 2010-03-05 FFF

Большое спасибо за вашу помощь!

Ответы [ 3 ]

1 голос
/ 23 марта 2012

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

Если ваша таблица А может содержать больше разнообразия:

SELECT
    *
FROM
    TableB b
       inner join
    TableA a
       on
          b.dateb >= a.datea
       left join
    TableA a_nolater
       on
          a_nolater.datea > a.datea and
          b.dateb >= a_nolater.datea
WHERE
    a_nolater.seq is null

Это объединяет две таблицы вместе, а затем пытается найти «лучшее» объединение (строка из таблицыa, которая встречается позже, чем текущая совпадающая, и все равно будет совпадать для tableb). Он возвращает только те строки, в которых он не может найти это «лучшее» соединение. Таким образом, он находит последнюю строку с датой в таблице A, которая находится на или перед датой из таблицы B.

1 голос
/ 23 марта 2012

Я считаю, что вы просите присоединиться к году и месяцу

select 
      seq,datea,dateb,sthvalue 
from 
      TableA inner join Tableb 
      on datepart(year,datea) = datepart(year,dateb) and 
         datepart(month,datea) = datepart(month,dateb)
      order by seq,dateb
0 голосов
/ 23 марта 2012

Можно

select
    a.seq,
    a.datea,
    b.dateb,
    b.sthvalue
from 
    tablea a inner join tableb b on (b.dateb >= a.datea and b.dateb < dateadd(month, 1, a.datea))
order by 
    a.seq, b.sthvalue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...