如何显示每行的最新值

How to show the most recent value for each row

这是我当前的查询。我使用内联视图仅显示在特定证券交易所交易股票数量最多的公司的前 5 个结果。除此之外,我想显示每一行的最新价格。此信息可在 stock_price table 中找到,并带有相应的日期。

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,
SUM(t.shares),
sp.price
FROM 
company c 
JOIN trade t 
ON c.stock_id = t.stock_id
JOIN stock_price sp
ON sp.stock_id = t.stock_id
AND sp.stock_ex_id = t.stock_ex_id
WHERE sp.stock_ex_id =3
GROUP BY c.name, sp.price
;

输出:

你可以使用子查询

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 从价格 table 中选择价格,为交易所过滤,为在第一个子查询中找到的五只股票,以及为所需的日期(在你添加之后) .它使用聚合 LAST 函数——对于此类查询非常有用的聚合函数,不幸的是被许多开发人员忽略了。

最后一步是加入两个 table。最好只在两次聚合之后加入tables。 (无论如何,如果统计数据是最新的,无论您如何编写查询,只要编写正确,优化器都会找到最佳操作顺序。事实上,优化器可能会选择执行仅在“交易”table 上进行“前五名”聚合,并仅在最后一步加入“公司”。)