如何显示每行的最新值
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 上进行“前五名”聚合,并仅在最后一步加入“公司”。)
这是我当前的查询。我使用内联视图仅显示在特定证券交易所交易股票数量最多的公司的前 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 上进行“前五名”聚合,并仅在最后一步加入“公司”。)