首页 > 解决方案 > 如何在聚合函数中找到前 5 个值

问题描述

我正在尝试输出 SUM(t.shares) 的前 5 个值,我还需要显示公司名称、当前股价和上次价格变化的百分比。当我在 select 中添加 sp.price 时,我还必须将其添加到 group by 中,然后表格返回太多不需要的行。有没有办法可以解决它?另外,我如何计算最后一次价格变化的百分比变化?

这是ERD

这是问题:

列出纽约证券交易所前 5 家公司(按股东交易量计算)。显示公司名称、股东交易量、当前价格和上次价格变化的百分比变化。按交易量的降序对输出进行排序。数据库中的样本数据仅包含 3 家公司的信息,但即使有更多公司的数据,您的查询也必须继续仅列出前 5 家公司。

select
    c.name,
    SUM(t.shares)
from trade t
    join company c
        on t.stock_id = c.stock_id
    join stock_exchange se
        on se.stock_ex_id = t.stock_ex_id
    join stock_price sp
        on sp.stock_ex_id = se.stock_ex_id 
        and sp.stock_id = c.stock_id
    where se.name = 'New York Stock Exchange'
group by c.name;

标签: sqloracle

解决方案


我相信你需要的是分析函数而不是聚合函数

在这里你可以得到这个想法:

“11克”:

SELECT * FROM (
SELECT * FROM (
select
    c.*,
    SUM(t.shares) over (PARTITION BY c.name) as Total_SUM
from trade t
    join company c
        on t.stock_id = c.stock_id
    join stock_exchange se
        on se.stock_ex_id = t.stock_ex_id
    join stock_price sp
        on sp.stock_ex_id = se.stock_ex_id 
        and sp.stock_id = c.stock_id
    where se.name = 'New York Stock Exchange'
            ) ORDER BY Total_SUM DESC
            ) WHERE ROWNUMBER <=5;

'>= 12c':

SELECT * FROM (
select
    c.*,
    SUM(t.shares) over (PARTITION BY c.name) as Total_SUM
from trade t
    join company c
        on t.stock_id = c.stock_id
    join stock_exchange se
        on se.stock_ex_id = t.stock_ex_id
    join stock_price sp
        on sp.stock_ex_id = se.stock_ex_id 
        and sp.stock_id = c.stock_id
    where se.name = 'New York Stock Exchange'
            ) ORDER BY Total_SUM DESC FETCH FIRST 5 ROWS ONLY

推荐阅读