0

我有一个很大的查询结果,它显示了每个人在数周内的体重,我想找到体重在数周内总是增加的人的名字。下面是一个示例数据。

    name        week        weight
    tom         2020W10     76
    tom         2020W09     75
    tom         2020W08     74
    jane        2020W10     65
    jane        2020W09     65
    jane        2020W08     64

因此,在上述示例数据的情况下,我只想在我的结果中看到 Tom,因为他的体重总是随着日期的增加而增加。在我的原始数据集中,我有 10,000 个名字和超过 10 周的时间,所以用更暴力的方法真的很难做到。我正在考虑在大查询中使用回归函数,但是我必须做尽可能多的回归,因为我有唯一的名称。我真的很感激任何帮助。谢谢!

4

1 回答 1

1

一种方法使用lag()和聚合:

with t AS (
      SELECT 'tom' AS name, '2020W10' AS week, 76 AS weight UNION ALL
      select 'tom' , '2020W09' , 75 UNION ALL
      select 'tom' , '2020W08' , 74 UNION ALL
      select 'jane' , '2020W10' , 65 UNION ALL
      select 'jane' , '2020W09' , 65 UNION ALL
      select 'jane' , '2020W08' , 64
    )
select t.name
from (select t.*, lag(weight) over (partition by name order by week) as prev_weight
      from t
     ) t
group by t.name
having countif(prev_weight >= weight) = 0 ;
于 2020-04-20T12:08:08.420 回答