【问题标题】:Select higher value选择更高的价值
【发布时间】:2020-09-01 10:34:36
【问题描述】:

我有这个数据集:

Var1  t  avg
AA   1  0.02
AA   0  0.21
BB   1  0.05
BB   0  0.20
CC   1  0.10
CC   0  0.14

如下构建

Proc sql;
    Select 
    Var1,
    t,
    Avg(var2) as avg
    From my_data
    Group by 1,2
    Order by 1,2; quit;

我的预期输出是

    AA   0  0.21
    BB   0  0.20
    CC   0  0.14

您能给我一些建议吗? 我一直在使用 max 函数来做到这一点。我会尝试将问题分为两个步骤:首先为每个组(AA、BB 和 CC)选择较高的值,然后我会选择这些值之间的最大值。我不知道这是否是正确的方法

【问题讨论】:

  • 。 .目前尚不清楚您想要什么作为结果集。一排?每个id 一行?每个t 一行? “变量”是什么意思?样本数据和期望的结果会有所帮助。
  • 被存储为 var3 和允许我得到这个结果的逻辑(例如,在其他情况下选择这个值应该被保存为 var 3)。 I不明白。如果 Gordon 的回答没有帮助,您应该尝试清楚地描述您的逻辑。
  • 我只需要将值存储为 var3。有时会发生这样的情况,当您过滤变量时,您使用 case when 或 max 或其他定义新变量的函数或条件。情况就是这样。我曾尝试使用 top 和qualify 但由于它在proc sql 中,我得到了一些错误(请参阅上面的代码)
  • 哪个值?你得到三列,AA 0 0.21,这个var3 应该包含什么?
  • 我应该选择的是每个组的 var1 具有更高的平均值。这个选择背后的逻辑应该允许我定义这个新变量。但我感兴趣的应该是每个具有更高平均值的值。很抱歉,但我无法解释得比这更好 :( 为避免混淆,我删除了 var3 上的所有提及

标签: sql teradata proc-sql


【解决方案1】:

如果您只想要平均最高的一行,请使用top:

Select top 1 Var1, t, Avg(var2) as avg
From my_data
Group by 1,2
Order by avg desc;

如果你想要这个每个t,那么使用qualify 和row_number():

select Var1, t, Avg(var2) as avg
from my_data
group by 1,2
qualify row_number() over (partition by var1 order by avg desc) = 1;

【讨论】:

  • @Math 。 . .这是此答案中的第二个查询。
  • 谢谢戈登。它是否也适用于 proc sql?
  • @Math 。 . .您的问题被标记为 Teradata,而不是 proc sql。它是有效的 Teradata 代码,因此它应该在直通模式下工作。
  • 道歉戈登。我不知道proc sql还有另一个标签。我修好了它。抱歉,我是 SQL 和 proc SQL 的新手
  • @Math 。 . .使用 proc-sql 标签提出另一个问题。
猜你喜欢
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
相关资源
最近更新 更多