sql - group by 子句和聚合函数的问题
问题描述
我正在处理这个问题:对于每个证券交易所,显示总交易量最高的股票代码。显示证券交易所名称、股票代码和总交易量。按证券交易所名称和股票代码对输出进行排序。
这是我的查询和输出:
SELECT
se.name AS "stock exchange name",
sl.stock_symbol AS "stock symbol",
SUM(t.shares) AS "highest total trade volume"
FROM stock_exchange se
JOIN trade t
ON se.stock_ex_id = t.stock_ex_id
JOIN company c
ON t.stock_id = c.stock_id
JOIN stock_listing sl
ON se.stock_ex_id = sl.stock_ex_id and sl.stock_id = c.stock_id
GROUP BY sl.stock_symbol,se.name
HAVING SUM(t.shares) =(
SELECT
MAX(SUM(t.shares))
FROM(
SELECT
SUM(shares) over(partition by sx.stock_ex_id)
FROM stock_exchange sx
JOIN trade tr
ON tr.stock_ex_id = sx.stock_ex_id
JOIN company co
ON co.stock_id = tr.stock_id
)
)
ORDER BY se.name, sl.stock_symbol;
Stock exchange name stock symbol highest total trade volumn
1 Euronext Paris BNP 5000
2 Euronext Paris EDF:EN PARIS 78600
3 London Stock Exchange BA 126400
4 NASDAQ Stock Exchange TESO 164100
5 New York Stock Exchange GOOG 132300
6 New York Stock Exchange NYT 111900
7 New York Stock Exchange TM 50300
8 Tokyo Stock Exchange TYO:6201 5300
第 1,6 和 7 行不是该证券交易所的最高交易量,并且不知何故仍显示在输出中。我注意到当我不按函数将 sl.stock_symbol 分组时,它会打印预期的确切行。但是我需要显示这个股票代码列,那么我该如何解决呢?
解决方案
好吧,如果没有数据样本,很难知道你真正想要什么。但是,正如您所说,删除股票代码会为您提供正确的值,也许从 group by 中删除该部分并在 group by 之后的新选择中恢复该字段是一个好主意。您没有使用该字段进行计算。
我不知道你正在处理的卷,所以性能方面不知道它会如何表现
例子
select r.se_name AS "stock exchange name",
t.stock_symbol AS "stock symbol",
r.max_shares as "highest total trade volumn"
from
(
SELECT
se.name,
se.stock_ex_id
-- sl.stock_symbol ,
SUM(t.shares) as max_shares
FROM stock_exchange se
JOIN trade t
ON se.stock_ex_id = t.stock_ex_id
JOIN company c
ON t.stock_id = c.stock_id
JOIN stock_listing sl
ON se.stock_ex_id = sl.stock_ex_id and sl.stock_id = c.stock_id
GROUP BY sl.stock_symbol
HAVING SUM(t.shares) =(
SELECT
MAX(SUM(t.shares))
FROM(
SELECT
SUM(shares) over(partition by sx.stock_ex_id)
FROM stock_exchange sx
JOIN trade tr
ON tr.stock_ex_id = sx.stock_ex_id
JOIN company co
ON co.stock_id = tr.stock_id
)
)
) r join stock_listing t on r.stock_ex_id = t.stock_ex_id
ORDER BY r.se_name, t.stock_symbol;
推荐阅读
- javascript - 用php在警报中换行
- ios - Swift 在课堂上获取 OneTimePassword (OTP)
- css - Bootstrap 4 列不向右浮动 - 右侧有空间
- java - 从 assets 文件夹中的文本文件中获取随机行
- r - R Shiny - 没有活跃的反应上下文不允许操作
- r - 如何在 Google Colab 的 Jupyter notebook 中使用 R 运行 plotly 包
- typescript - NextJS、Storybook、SVG 和绝对导入路径
- java - 如何使用 selenium 多次运行同一个类
- javascript - 在 JavaScript 中创建 onclick 类的新实例的正确方法是什么?
- c# - 部分类在内部与常规类不同吗?