选取 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“分组依据”中的任何元素的主要内容,如果未能解决你的问题,请参考以下文章

Spider-scrapy 中的 xpath 语法与调试

XPath语法

XPath 选取未知节点 & 选取若干路径

xpath用法(持续更新ing)

jquery使用css选择器来选取元素吗

JavaScript之DOM-3 选取元素(通过 HTML 选取元素通过 CSS选取元素其他选取)