используя все значения из одного столбца в другом запросе - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь найти решение для следующей проблемы, которую я имею в sql-server:

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

Таблица T1:

+--------+-------------+
| agency |  end_date   |
+--------+-------------+
|      1 | 2017-10-01  |
|      2 | 2018-01-01  |
|      3 | 2018-05-01  |
|      4 | 2012-01-01  |
|      5 | 2018-04-01  |
|      6 | 2017-12-01l |
+--------+-------------+

Я буквально хочу использовать все значения в столбце end_date и вставить его в запрос здесь (я пометил его ***):

    with averages as (
select      a.id as agency
            ,c.rate  
            , avg(c.rate) over (partition by a.id  order by a.id )  as avg_cost


from table_a as a
                     join  rates c on a.rate_id = c.id


and c.end_date =  **here I use all values from t1.end_date** 
and c.Start_date =  **here I use all values from above minus half a year** = dateadd(month,-6,end_date)

group by    a.id 
            ,c.rate  
            )
select distinct agency, avg_cost  from averages 
order by 1 

Причина, по которой мне нужны две динамические даты, заключается в том, что значения avg_rate меняются, если вы меняете временной интервал между этими датами.

Моя проблема и мой вопрос:

Как вы можете взять end_date из таблицы t1, вставить его в запрос, где находится c.end_date, и пройти через все значения в t1.end_date?

Я ценю вашу помощь!

Ответы [ 2 ]

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

Я могу придумать несколько способов сделать это - Курсор , StoredProcedure , Соединения ... Учитывая простоту вашего запроса, декартово произведение ( Cross Join ) из Таблица T1 против средних CTE должно творить чудеса.

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

Вам действительно нужно среднее окно?Попробуйте это.

;with timeRanges AS
(
    SELECT
        T.end_date,
        start_date = dateadd(month,-6, T.end_date)
    FROM
        T1 AS T
)
select      
    a.id as agency,
    c.rate,
    T.end_date,
    T.start_date,
    avg_cost = avg(c.rate)
from 
    table_a as a
    join  rates c on a.rate_id = c.id
    join timeRanges AS T ON A.DateColumn BETWEEN T.start_date AND T.end_date
group by   
    a.id ,
    c.rate,
    T.end_date,
    T.start_date

Вам нужен столбец даты, чтобы объединить ваши данные с T1 (я назвал его DateColumn в этом примере), иначе все диапазоны времени будут возвращать одинаковые средние значения.

...