表格设置如下:

我正在试着按产品代码和公司得到最近7张发票的平均值.

Company Product_Code Price Invoice Date
A XYZ 10 01012023
B XYZ 11 01012023
C XYZ 12 01012023
A ABC 12 01022023
B ABC 13 01022023
C ABC 14 01022023
A LMN 15 01022023

我try 了一些类似的方法:

SELECT 
    t1.company, t1.product_code, AVG(price) 
FROM 
   (SELECT 
        * 
    FROM
        Table
    ORDER BY invoice_date DESC 
    LIMIT 7) AS t1
GROUP BY t1.company, t1.product_code, t1.price
HAVING t1.company = 'A' or t1.company = 'B' or t1.company = 'C'

但这只是返回表中的最后7张发票--我如何才能按公司和产品代码获得最后7张发票?

推荐答案

这将对所有行的最后7xInvoice Date行执行此操作:

SELECT company, product_code, AVG(price) 
FROM a
WHERE "Invoice Date" IN (SELECT TOP 7 "Invoice Date" FROM a ORDER BY "Invoice Date" DESC)
GROUP BY company, product_code

这将对每company/product code个组合的最后7个组合执行此操作:

SELECT a.company, a.product_code, AVG(a.price) FROM a
JOIN (SELECT company, product_code, MIN("Invoice Date") "Invoice Date" FROM a WHERE "Invoice Date" IN (SELECT TOP 7 "Invoice Date" FROM a ORDER BY "Invoice Date" DESC) GROUP BY company, product_code) b
    ON a.company = b.company AND a.product_code = b.product_code AND a."Invoice Date" = b."Invoice Date"
GROUP BY a.company, a.product_code

Sql相关问答推荐

有没有一种正确的方法来利用SQL UNION来从三个潜在查询中 Select 最大值?

使用来自不同深度的嵌套组的值执行计算的干净方法?

使用`lag()`获取上一个时间戳

如何根据特定的内部json元素值过滤postgres查询结果?

HAVING子句内部过滤的正确方法

在Netezza SQL中将字符DataType转换为整型DataType

不存在记录的国外关键点

为什么SQL in中的空子查询有时被视为null

group by 并根据同表中其他列的某些条件获取 group by 中的某一列值

连续天跟踪购买情况(将标记返回到另一列?)

在 SQL Server 中查找重复项

SQL Server - 复杂场景 - 比较状态并填充值到后续行

删除重复记录但保留最新的SQL查询

带聚合函数的 percentile_cont

T-SQL - 返回每条记录的最近雇佣日期

PostgreSQL 中的递归树查询

有没有一种方法可以将始终遵循序列的单个字段的值组合起来,以创建每个 ID 的所有移动?

在时态表和非时态表之间使用 EXCEPT 的 SQL 子查询给出表达式错误数

SQL中所有先前日期的累计总和

为什么这是 AND,OR with NULL 的真值表?