Sql 如何显示每行的最新值

Sql 如何显示每行的最新值,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,这是我目前的问题。我使用内联视图仅显示在特定证券交易所交易量最高的公司的前5名结果。除此之外,我还想展示每行的最新价格。该信息可在股票价格表中找到,并附有相应的日期 SELECT * FROM ( SELECT c.name AS company_name, t.stock_id AS stock_id, SUM(t.shares) AS Trade_Volume FROM comp

这是我目前的问题。我使用内联视图仅显示在特定证券交易所交易量最高的公司的前5名结果。除此之外,我还想展示每行的最新价格。该信息可在股票价格表中找到,并附有相应的日期

SELECT 
*
FROM
    (
        SELECT
            c.name AS company_name,
            t.stock_id AS stock_id,
            SUM(t.shares) AS Trade_Volume
        FROM company c
            JOIN trade t
            ON c.stock_id = t.stock_id
            JOIN stock_price sp
            ON sp.stock_ex_id =3 
            AND sp.stock_id = t.stock_id
            WHERE t.stock_ex_id = 3
        GROUP BY
            c.name, t.stock_id
            ORDER BY SUM(t.shares) DESC
    )
WHERE
    ROWNUM <= 5;
输出:

您可以使用子查询

SELECT 
    , c.name
    , shares =SUM(t.shares)
    ,  price = (select top 1 price 
                 from stock_price where stock_price.stock_id = t.stock_id
                   AND stock_price.stock_ex_id = t.stock_ex_id
                   order by stock_price.pricedate desc
                  )
    FROM 
    company c 
    JOIN trade t ON c.stock_id = t.stock_id
    WHERE sp.stock_ex_id =3
    GROUP BY c.name

你可以做这样的事,但不需要测试;询问后解释:

with
  high_vols as (
    select *
    from   (
             select c.name as company_name, c.stock_id as stock_id,
                    sum(t.shares) as trade_volume
             from   company c join trade t on c.stock_id = t.stock_id
             where  t.stock_ex_id = 3
             group  by c_name, c.stock_id
             order  by sum(t.shares) desc
           )
    where  rownum <= 5
  )
, last_prices as (
    select stock_id, 
           min(price) keep (dense_rank last order by price_date) as last_price
    from   stock_price
    where  stock_id in (select stock_id from high_vols) and stock_ex_id = 3
    group  by stock_id
  )
select hv.company_name, hv.stock_id, hv.total_volume, lp.last_price
from   high_vols hv join last_prices lp on hv.stock_id = lp.stock_id
order  by total_volume desc
;
HIGH_VOLS是您已经进行的查询。它可以在给定的交易所中找到交易量最高的五只股票——如果您将其添加到查询中,则可以在给定的日期找到这五只股票;您在查询中没有这样做,并且您没有足够详细地描述您的数据以尝试将其添加到查询中,但是您应该能够自己这样做。请注意,关于日期的相同观察结果也适用于WITH子句中的第二个查询

LAST_PRICES从价格表中选择价格,为交易所、在第一个子查询中找到的五只股票以及添加该子查询后的所需日期进行过滤。它使用了aggregate LAST函数,这是一个非常有用的用于此类查询的聚合函数,不幸的是,许多开发人员都忽略了它


最后一步是连接两个表。最好仅在两次聚合之后才连接表。在任何情况下,如果统计信息是最新的,那么无论您如何编写查询,只要正确编写查询,优化器都会找到最佳的操作顺序。事实上,优化器可能会选择只在交易表上进行前五名聚合,并仅在最后一步加入公司。

选择列表中的等号?是否有任何数据库/SQL方言支持此功能?当然不是甲骨文。那么,在整个查询中,您将输出限制在OP要求的前五个结果的哪一个?对不起,我对没有意义的答案投了反对票。@mathguy T-SQL使用此语法,只是为了回答注释的第一部分:这是SQL server语法。如果你的数据库是mysql,请使用Asorry,但我不相信你。你的第一次?查询有where rownum根据我的数据,我只有3个股票交易所的结果。哦,好的-明白了。虽然很奇怪;这一定是一次非常奇怪的交换,否则,您无法获得完整的数据。或者你只是在做一个小的测试样本?股票价格表的结构是什么?与什么相关的最新日期是什么?股票价格列:股票id、股票ex\U id、价格、时间开始、时间结束
with
  high_vols as (
    select *
    from   (
             select c.name as company_name, c.stock_id as stock_id,
                    sum(t.shares) as trade_volume
             from   company c join trade t on c.stock_id = t.stock_id
             where  t.stock_ex_id = 3
             group  by c_name, c.stock_id
             order  by sum(t.shares) desc
           )
    where  rownum <= 5
  )
, last_prices as (
    select stock_id, 
           min(price) keep (dense_rank last order by price_date) as last_price
    from   stock_price
    where  stock_id in (select stock_id from high_vols) and stock_ex_id = 3
    group  by stock_id
  )
select hv.company_name, hv.stock_id, hv.total_volume, lp.last_price
from   high_vols hv join last_prices lp on hv.stock_id = lp.stock_id
order  by total_volume desc
;