如何通过 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 中特定列中的模式更改对行进行分组

SQL Server:根据列中的日期返回最近的记录

如何根据条件对sql中的行进行分组

当用户在 MS Access 中修改表中的另一列时,如何在 SQL Server 中将列设置为今天的日期 [关闭]

如何将一个字段中的日期与另一字段中的时间结合起来 - MS SQL Server