选取 SQL“分组依据”中的任何元素
Posted
技术标签:
【中文标题】选取 SQL“分组依据”中的任何元素【英文标题】:Pick up any element in SQL "group by" 【发布时间】:2017-03-27 10:19:57 【问题描述】:我有行程的航班记录,并且可以保证所选行程的所有价格都是相同的货币。
使用group by
查询我得到总sum
的行程价格:
select ITINERARY_ID, sum(PRICE) from FLIGHT group by ITINERARY_ID;
我如何选择货币(对于给定的ITINERARY_ID
,它们都一样)?
我以min
/max
结尾:
select ITINERARY_ID, sum(PRICE), max(CURRENCY) from FLIGHT group by ITINERARY_ID;
但如果我只想选择 any 元素(它们都一样),那么对 CURRENCY
进行排序是不明智的。
min
/max
只是可能的解决方案吗?可以提高查询性能吗?
【问题讨论】:
你使用什么数据库引擎? Oracle 但它落后于 Hibernate ORM。窗口函数是否可以解决我的问题? 【参考方案1】:(对于给定的 ITINERARY_ID,它们都相同)
你不需要聚合它,你可以把你的查询写成
select ITINERARY_ID, CURRENCY, sum(PRICE)
from FLIGHT
group by ITINERARY_ID, CURRENCY
【讨论】:
group by
在两个字段上的性能与group by
在一个 + max
在第二个字段上的性能相同,不是吗?
是的,我想性能是一样的。我认为从这个意义上说优化这样一个简单查询的空间不大,您可以考虑改用索引【参考方案2】:
真正的解决方案在于桌子设计。您说保证行程的所有价格都使用相同的货币。但是您存储每个航班的货币,这在技术上允许在行程中使用不同货币。
将货币与行程一起存储并相应地查询:
select i.itinerary_id, f.total_price, i.currency
from itinerary i
join
(
select itinerary_id, sum(price) as total_price
from flight
group by itinerary_id
) f on f.itinerary_id = i.itinerary_id;
【讨论】:
【参考方案3】:您可以在group by
中包含currency
:
select ITINERARY_ID, currency, sum(PRICE)
from FLIGHT
group by ITINERARY_ID, currency;
或者使用聚合函数:
select ITINERARY_ID, MAX(currency) as currency, sum(PRICE)
from FLIGHT
group by ITINERARY_ID;
如果货币确实相同,那么它们会产生相同的结果。
【讨论】:
您的第二个查询有错字吗?您对应用聚合函数的同一元素进行分组... @gavenkoa 。 . .谢谢你。在第二种情况下,GROUP BY
子句不应包含该列。以上是关于选取 SQL“分组依据”中的任何元素的主要内容,如果未能解决你的问题,请参考以下文章