如何根据 SQL 服务器中的分组列根据日期列的最后 3 个月获取列平均值?

How to get a column average according to date column's last 3 months by grouped columns in SQL Server?

我有这 3 个表:

表 1

counter_ID house_ID
123456 567890
123457 567810
123463 567811
123478 567812

表 2

counter_ID owner_ID receipt_ID
123456 0901987 678954
123457 0901987 423567
123463 0901987 543211
123478 0901987 345332

表 3

金额 owner_ID receipt_ID 日期
575 0901987 678954 2020-02-20
300 0901987 678954 2020-04-21
450 0901987 678954 2020-05-22
125 0901987 678954 2020-06-21
180 0901987 423567 2020-02-20
350 0901987 423567 2020-03-21
1200 0901987 543211 2020-02-20
600 0901987 543211 2020-03-20
700 0901987 543211 2020-04-20
380 0901987 345332 2020-02-20
475 0901987 345332 2020-04-20
950 0901987 345332 2020-07-20
110 0901987 345332 2020-08-20

我要创建的输出:

owner_ID counter_ID receipt_ID house_ID avg_Amount
0901987 123456 678954 567890 362
0901987 123457 423567 567810 265
0901987 123463 543211 567811 833
0901987 123478 345332 567812 478

如何从表 1、表 2、表 3 创建此输出?

我想在结果中按照下面的公式计算,第avg_Amount列:

最近3个月的平均发票金额,但如果相同owner_ID和receipt_ID的发票天数小于3(表3中的count(records),取其平均值可用天数。

我不是很清楚你说的只想要 3 个月是什么意思。

您似乎想要取最早行三个月内的所有行的平均值(当按 receipt_ID 分区时)。

为此我们可以使用 window 函数

SELECT
  t2.owner_ID,
  t2.counter_ID,
  t2.receipt_ID,
  t1.house_ID,
  avg_Amount = AVG(t3.amount)
FROM Table1 t1
JOIN Table2 t2 ON t2.counter_ID = t1.counter_ID
JOIN (
    SELECT *,
        MaxDate = MAX(t3.[Date]) OVER (PARTITION BY t3.receipt_ID)
    FROM Table3 t3
) t3 ON t3.receipt_ID = t2.receipt_ID
    AND t3.[Date] > DATEADD(month, -12, t3.MaxDate)
GROUP BY
  t2.owner_ID,
  t2.counter_ID,
  t2.receipt_ID,
  t1.house_ID;