如何根据 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;
我有这 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;