所以我在选择和构思如何使其工作方面遇到了麻烦。
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
此脚本在View表中用作LEFT OUTER JOIN
,因此,如果我order
通过它festpae_id
然后设置rownum = 1
它在View表中无法正常工作(但如果与整个View表select分开运行(作为左外部联接),则可以正常工作),这就是为什么我问你的帮助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
(根据需要返回最后一行)。如果您得到不同的结果,则必须涉及其他方面。我不知道那是什么-显然,查询工作正常(从我的角度来看)。
别客气。不幸的是,我看不到图像。如果结果不合适,那么您现在知道了原理-稍微调整一下查询。
是的,谢谢。您有很多帮助。现在,他只返回2条最高记录,分别有40条和50条折扣。有什么方法可以只用一个来限制它,所以他会看最新的一个吗?在这种情况下,它是50,而不是40。
我在答案中发布了更多信息;请看看。
是的,谢谢!第一次错过了东西!
最后一个问题,我可以不依靠
discount
价值来做到这一点吗?因为在某些情况下,当类似价值的折扣40
较高时,FESTPAE_ID
=>(2000745)