sql - 甲骨文。从选择的广告中获取最大值然后进行比较
问题描述
所以我在选择和想法如何使它工作时遇到了一些麻烦。
SELECT data1.discount, data7.osp_id, data6.id AS sero_id, data1.estpt_id, data5.festpae_id, MAX(data5.festpae_id) as max_id FROM database1 data1
JOIN database2 data2 ON data2.id = data1.attr_id
JOIN database3 data3 ON data3.attr_id = data2.id
JOIN database4 data4 ON data4.objt_attr_id = data3.id
JOIN database5 data5 ON data5.stya_id = data4.id
AND data5.value = 1
JOIN database6 data6 ON data6.id = data5.sero_id
JOIN database7 data7 ON data7.id = data6.data7_id
JOIN database8 data8 ON data8.code = 'CALC1'
WHERE data1.interest_rate = 1 AND data1.ordet_id = data8.id
AND data1.objt_attr_id = data4.objt_attr_id
这是我选择的女巫无法正常工作。我收到一个错误,例如
ORA-00937: not a single-group group function
据我了解,这是由于MAX()
参数而发生的。
没有的输出MAX()
是这个:
discount osp_id sero_id estpt_id festpae_id
40 619356 3931831 2144 2000742
50 619356 3931831 2144 2000743
40 619356 3931831 2144 2000737
50 619356 3931831 2144 2000740
所以你可以理解我需要获得=>MAX
的价值festpae_id
2000743
最后的想法是获取MAX
的值festpae_id
并将其与 进行比较data5.festpae_id
,这是获得 1 条实际记录所必需的,而不是全部记录。
所以最终的输出应该是这样的:
discount osp_id sero_id estpt_id festpae_id
50 619356 3931831 2144 2000743
该脚本在视图表中使用LEFT OUTER JOIN
,所以如果我order
通过festpae_id
然后设置rownum = 1
它在视图表中无法正常工作(但如果与整个视图表选择(作为左外连接)分开运行,则它可以工作),这就是为什么我'我请求你的帮助如何做到这一点MAX()
。或者有什么更好的方法吗?
解决方案
一般来说,未聚合的列应该是GROUP BY
子句的一部分。你加入了很多表,我不明白去哪里,但是 - 看看这是否有帮助(注意我写的评论):
SELECT MAX (data1.discount), --> apply aggregate here
data7.osp_id,
data6.id AS sero_id,
data1.estpt_id,
-- data5.festpae_id, --> remove this
MAX (data5.festpae_id) AS max_id
FROM database1 data1
JOIN database2 data2 ON data2.id = data1.attr_id
JOIN database3 data3 ON data3.attr_id = data2.id
JOIN database4 data4 ON data4.objt_attr_id = data3.id
JOIN database5 data5
ON data5.stya_id = data4.id
AND data5.VALUE = 1
JOIN database6 data6 ON data6.id = data5.sero_id
JOIN database7 data7 ON data7.id = data6.data7_id
JOIN database8 data8 ON data8.code = 'CALC1'
WHERE data1.interest_rate = 1
AND data1.ordet_id = data8.id
AND data1.objt_attr_id = data4.objt_attr_id
GROUP BY data7.osp_id, data6.id, data1.estpt_id --> add all non-aggregated columns here
[编辑]
使用您发布的示例数据和我建议应用于它的查询,结果似乎还可以:
SQL> with test (discount, osp_id, sero_id, estpt_id, festpae_id) as
2 (
3 select 40, 619356, 3931831, 2144, 2000742 from dual union all
4 select 50, 619356, 3931831, 2144, 2000743 from dual union all
5 select 40, 619356, 3931831, 2144, 2000737 from dual union all
6 select 50, 619356, 3931831, 2144, 2000740 from dual
7 )
8 select max(discount) discount,
9 osp_id,
10 sero_id,
11 estpt_id,
12 max(festpae_id) festpae_id
13 from test
14 group by osp_id,
15 sero_id,
16 estpt_id;
DISCOUNT OSP_ID SERO_ID ESTPT_ID FESTPAE_ID
---------- ---------- ---------- ---------- ----------
50 619356 3931831 2144 2000743
SQL>
如您所见,仅返回一行FESTPAE_ID = 2000743
(最后一行,如您所愿)。如果你得到了不同的结果,那肯定还有别的东西。那会是什么,我不知道 - 显然,查询工作正常(从我的角度来看)。
推荐阅读
- mysql - 无法在 ssrs 中使用 mysql 存储过程
- sql - 如何删除我通过 sql 语句创建的所有表?
- python - 自定义按钮添加到屏幕后不再起作用
- javascript - 从 getInitialProps() 获取请求数据
- scala - spark如何解释reduce中的列类型
- xml - XSLT:在 svg 文件的根目录插入节点
- google-chrome-extension - 如何在 chrome.webRequest.onBeforeRequest 触发之前从 chrome.tabs.onCreate 获取信息?
- java - 启动使用 fxml 文件的应用程序时应用程序启动方法出现异常
- android - 如何使用 getSupportFragmentManager 将包传递到片段中?
- javascript - 解释匿名函数