如何通过 SQL Server 中的分组列根据日期列的最近 3 个月获取列平均值?
Posted
技术标签:
【中文标题】如何通过 SQL Server 中的分组列根据日期列的最近 3 个月获取列平均值?【英文标题】:How to get a column average according to date column's last 3 months by grouped columns in SQL Server? 【发布时间】:2021-07-16 15:18:41 【问题描述】:我有这 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
amount | owner_ID | receipt_ID | Date |
---|---|---|---|
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 |
如何从 Table1、Table2、Table3 创建这个输出?
我想在结果中按照以下公式计算,列avg_Amount:
最近 3 个月的平均发票金额,但如果相同 owner_ID 和receipt_ID 的发票天数小于 3(表 3 中的 count(records) 天数,则取该可用天数的平均值。
【问题讨论】:
你有没有尝试过..?他们是什么?为什么他们不工作?你说receipt_ID
小于3
,但receipt_ID
的值都不是< 3
。
在table3中,有count(receipt_ID)
take the average of that available days.
是什么意思,如果只是平均值,和超过 3 行有什么不同
@Charlieface 需要最近 3 个月的平均值。也就是说,如果有 4 个月的记录,则要求前 3 个月的平均值。但如果注册时间不足3个月,则取算术平均值。
【参考方案1】:
我不完全清楚你只想要 3 个月是什么意思。
您似乎想取最早行三个月内的所有行的平均值(按receipt_ID
分区时)。
为此我们可以使用窗口函数
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;
【讨论】:
您好 Charlieface,感谢您的回复。抱歉耽搁了。 Covid-19 疫苗对我的影响非常严重。所以之前无法回复你。我想根据过去 12 个月的数据取平均值,这些数据按 t2.owner_ID、t2.counter_ID、t2.receipt_ID、t1.house_ID 分组。如果分组数据包含少于 12 个月的记录,我想获得所有记录的平均值。然而;如果它有超过 12 个月的记录,我只想获得最近 12 个月记录的平均值。 “过去 12 个月的数据”是什么意思:从今天开始的过去 12 个月?或者该组owner_ID, counter_ID, receipt_ID, house_ID
的最近 12 个月的可用时间?
这是“该组 owner_ID、counter_ID、receipt_ID、house_ID 可用的最近 12 个月”。在我的示例表中,我想描述它 3 个月。
啊,所以您需要MAX
日期,而不是MIN
。已修复
非常感谢@Charlieface。以上是关于如何通过 SQL Server 中的分组列根据日期列的最近 3 个月获取列平均值?的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server - 在按特定列分组时构建动态范围的数字
根据 SQL Server 2008 R2 中特定列中的模式更改对行进行分组