【问题标题】:How to get max of the rows above in each group(Sql or SAS)如何在每个组(Sql 或 SAS)中获取上面的最大行数
【发布时间】:2017-02-28 11:14:48
【问题描述】:

数据:

ID   step order 
100  1    1
100  2    2
100  3    3
100  1    4
200  2    5
200  3    6
200  1    7

期望的结果(我想得到每组上面的最大行数)

ID   step  max_step
100  1     1
100  2     2
100  3     3
100  1     3
200  2     2
200  3     3
200  1     3

非常感谢!:)

【问题讨论】:

  • 什么数据库,什么版本?请适当标记您的问题。
  • 谢谢,它在 Teradata 中。
  • 你不能在 SQL 中做你想做的事。 SQL 表代表 无序 集。因此,如果没有确定排序的列,则没有上述行的概念。在 SAS 中,您可以使用带有 retain 的数据步。
  • 你说得对,我漏掉了一个列'order',表示这行数据进入数据库的顺序。我已经编辑了这个问题。谢谢。

标签: sql sas max teradata


【解决方案1】:

如果您的数据库支持窗口聚合,那么

SELECT id,
       step,
       Max(step) OVER( partition BY ID ORDER BY "order") as max_step
From yourtable

如果您想从上面的行中最大步长而不考虑ID,请删除partition by

SELECT id,
       step,
       Max(step) OVER(ORDER BY "order") as max_step
From yourtable

【讨论】:

  • 我试过这个。但似乎只能得到每组的最大值。我想在每个组中获取上面的行(包括当前行)的最大值。
  • @Sylvia - 但在您的预期结果中并非如此。对于max_step 中的ID = 2,即使之前的记录有3,您也有2
  • @Prdp 它使用新 ID 重置。但是id=2的第一行需要有一个2
  • 可能我的描述不够清楚。 Max 是不同的 id。所以'ID = 100'中的先前记录与'ID = 200'中的最大值无关。乔的回答很有帮助。
  • @Sylvia - 这正是我的第一个查询正在做的事情
【解决方案2】:

如果您想了解行顺序,那么在这里 SAS 将是更简单的答案。

data want;
  set have;
  by ID;
  retain max_step;
  if first.id then call missing(max_step);
  max_step = max(step,max_step);
run;

【讨论】:

  • 非常感谢!这正是我想要的!真的很感激!
【解决方案3】:

你需要一个累积最大值

max(step)
over(partition by id
     order by ordercol
     rows unbounded preceding)

由于 Teradata 不遵循默认为 range unbounded preceding 的标准 SQL,因此您需要添加它(无论如何推荐)。

只有last_value 默认为累积

last_value(step)
over(partition by id
     order by ordercol)

当然你也可以加rows unbounded preceding

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 2015-10-15
    • 2014-05-12
    • 2017-09-12
    • 2017-04-17
    相关资源
    最近更新 更多