【问题标题】:Extracting data based on different criteria根据不同的标准提取数据
【发布时间】:2018-09-25 00:46:07
【问题描述】:

所以我试图从给定 2015 年每个月的特定日期的数据集中提取日期、行使价和要价,其中额外的独特限制适用于行使价,我们想要最大的行使价及其相应的要价。例如,在日期 A,我们想要 max(strike price

SELECT currentdate,max(strike),ask
FROM opt
WHERE currentdate between '2015-01-16' and '2015-01-16'
AND T='P'
AND strike <=191.55;

当我在 impala 中运行它时,我遇到了错误:

在没有 Kerberos 身份验证的情况下启动 Impala Shell 错误:AnalysisException:选择列表表达式不是由聚合输出产生的(缺少 GROUP BY 子句?):currentdate

我很抱歉格式错误,对 Stackover 不是很熟悉。

【问题讨论】:

  • 该问题不应标记为impala。任何 SQL 数据库都会出现相同类型的语法错误。学习 SQL,这对你的职业生涯来说是一笔不错的投资……
  • 顺便说一句,应该不需要在strike 上使用 10 个不同的过滤器运行 10 个不同的查询 如果 Impala 支持 case 语法 (这已经很长时间了自从我上次使用该特定工具以来的时间...) > 尝试 10 个不同的列,例如 max(case when strike &lt;=191.55 then strike else null end) - 只需一次完整扫描。

标签: sql impala


【解决方案1】:

如果您的预期输出是当天的最大罢工和要价的日期列表,那么您需要按 currentdate 字段分组,否则查询引擎无法理解您想要特定日期的最大值.您现在拥有的查询无法运行,因为如果您不提供多条记录(没有组,您的记录集是单个行,而不是汇总行),则最大值不可用。

您缺少分组依据:

SELECT currentdate,max(strike),ask
FROM opt
WHERE currentdate between '2015-01-16' and '2015-01-16'
AND T='P'
AND strike <=191.55
GROUP BY currentdate;

这也会返回错误:

但您还需要为 ask 列提供聚合语句。这可能是最大值、平均值、最小值,具体取决于您的具体用例。

SELECT currentdate,max(strike),min(ask)
FROM opt
WHERE currentdate between '2015-01-16' and '2015-01-16'
AND T='P'
AND strike <=191.55
GROUP BY currentdate;

【讨论】:

  • 但我只想要与 max(strike) 关联的要价。所以做 min(ask) 不会给出想要的答案。
  • 如果您想要与当天的最大罢工相关联的询问,您将必须有子查询,您可以在表上自行加入,并查找询问当前日期和罢工的位置等于第一个查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
相关资源
最近更新 更多