我正在尝试为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_rates会有所不同。
我的问题和我的问题现在是:
如何从表t1中取出end_date将其插入到c.end_date所在的查询中,如果通过t1.end_date中的所有值,则循环?
感谢您的帮助!
答案 0 :(得分:1)
你真的需要平均窗口吗?试试这个。
;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
)相关联,否则所有时间范围都会返回相同的平均值。
答案 1 :(得分:0)
我可以想到几种方法 - 光标, StoredProcedure ,加入 ...... 鉴于查询的简单性,表T1 的笛卡尔产品(交叉加入)与平均值 CTE应该相对应做魔术。