sql - SQL 在 MAX 之后执行 AVG
问题描述
我有两张桌子。Table1
:
| ID1 | ID2 | ID3 | ID4 |
|-----+-----+-----+-----|
| 200 | 125 | 300 | 201 |
| 206 | 128 | 650 | 261 |
| 230 | 543 | 989 | 403 |
和Table2
:
| ID1 | ID2 | ID3 | ID4 | Date | Cost |
|-----+-----+-----+-----+--------+------|
| 200 | 125 | 300 | 201 | 1/1/19 | 0.32 |
| 200 | 125 | 300 | 201 | 1/1/19 | 0.33 |
| 200 | 125 | 300 | 201 | 1/1/19 | 0.34 |
| 200 | 125 | 300 | 201 | 1/2/13 | 0.00 |
| 200 | 125 | 300 | 201 | 9/5/05 | 0.01 |
我试图Join
Table1
在Table2
过滤输出的同时,只显示这些分类的最大值的一行,date
并且还显示该最大日期的平均值cost
。这是我当前的代码:
SELECT t1.ID1, t1.ID2, t1.ID3, t1.ID4, maxDate, avgCost
FROM Table1 t1
JOIN ( SELECT ID1, ID2, ID3, ID4, MAX(Date) as maxDate, AVG(Cost) as avgCost
FROM Table2 t2
GROUP BY ID1, ID2, ID3, ID4 ) t2
ON t2.ID1 = t1.ID1
AND t2.ID2 = t1.ID2
AND t2.ID3 = t1.ID3
AND t2.ID4 = t1.ID4
使用上面给出的示例数据,我的结果如下所示:
| ID1 | ID2 | ID3 | ID4 | MaxDate | AvgCost |
|-----+-----+-----+-----+-----------+---------|
| 200 | 125 | 300 | 201 | 1/1/19 | 0.20 |
当它应该看起来像这样
| ID1 | ID2 | ID3 | ID4 | MaxDate | AvgCost |
|-----+-----+-----+-----+-----------+---------|
| 200 | 125 | 300 | 201 | 1/1/19 | 0.33 |
平均成本包括date
未达到最大值的值。我假设这是由于在过滤AVG(cost)
之前执行的。这是我尝试过的:Table2
MAX(Date)
SELECT t1.ID1, t1.ID2, t1.ID3, t1.ID4, maxDate, avgCost
FROM Table1 t1
JOIN ( SELECT ID1, ID2, ID3, ID4, MAX(Date) as maxDate, AVG(Cost) as avgCost
FROM Table2 t2
GROUP BY ID1, ID2, ID3, ID4 ) t2
ON t2.ID1 = t1.ID1
AND t2.ID2 = t1.ID2
AND t2.ID3 = t1.ID3
AND t2.ID4 = t1.ID4
WHERE maxDate = (SELECT MAX(Date) from Table2);
和
SELECT t1.ID1, t1.ID2, t1.ID3, t1.ID4, maxDate, avgCost
FROM Table1 t1
JOIN ( SELECT ID1, ID2, ID3, ID4, MAX(Date) as maxDate, AVG(Cost) as avgCost
FROM Table2 t2
GROUP BY ID1, ID2, ID3, ID4 ) t2
ON t2.ID1 = t1.ID1
AND t2.ID2 = t1.ID2
AND t2.ID3 = t1.ID3
AND t2.ID4 = t1.ID4
WHERE maxDate = (SELECT MAX(Date) from Table2 GROUP BY ID1, ID2, ID3, ID4);
第一个没有结果,第二个导致错误,ORA-01427: single-row subquery returns more than one row
. 我尝试的其余部分基本上是上述的变体,但我仍然没有得到预期的结果。我不确定如何使该AVG
功能仅Date
在其最大值处执行...
解决方案
您的定义t2
如下所示:
( SELECT ID1, ID2, ID3, ID4, MAX(Date) as maxDate, AVG(Cost) as avgCost
FROM Table2 t2
GROUP BY ID1, ID2, ID3, ID4 ) t2
相反,要仅计算最近日期的平均值,它应该使用不同的聚合函数 -LAST
函数,如下所示:
( SELECT ID1, ID2, ID3, ID4, MAX(Date) as maxDate,
AVG(Cost) KEEP (DENSE_RANK LAST ORDER BY Date) as avgCost
FROM Table2 t2
GROUP BY ID1, ID2, ID3, ID4 ) t2
推荐阅读
- java - com.mysql.cj.jdbc.exceptions.MysqlDataTruncation:数据截断:日期值不正确:
- python - 使用 USDA Food API 按食品名称而不是 foodID 进行搜索
- c++ - *New Coder* 格式化和操作符
- excel - 格式化表格样式“”,接收变量未定义错误码
- c# - Visual Studio 2019 类图设计器工具箱为空
- sql - 在 SQL Server 2016 中将日期从 T 格式转换为 YYYYMMDD 格式
- swift - 如何在 SwiftUI 中将滚动视图添加到屏幕的特定部分?
- python - 我不知道 Flask 中的 SQLAlchemy 缺少哪些库
- javascript - 元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型 - Phaser
- vpn - 直接在C中而不是通过Swift中的packetFlow.readPackets读取tun FD时,如何处理tun FD数据包的前导4字节协议?