如何计算长格式数据中不规则间隔的百分比变化

时间:2016-11-11 20:57:09

标签: sql teradata

我有表P中的数据

id    bmi    contact_date
1     25     01/01/2015
1     26     06/15/2015
2     20     01/01/2014
3     21     03/12/2014
3     22     04/15/2015
3     NULL   09/12/2015
3     23     12/10/2015

我想用SQL做的是获取每个id的两个最新值(即每个id一行)的BMI百分比变化。如果没有两个值,那么我只想要一个'0'。

id   change
1     .04
2      0
3     .045

2 个答案:

答案 0 :(得分:2)

您可以使用OLAP函数获取两个最新值,然后只应用百分比计算:

SELECT id,
  Coalesce((Cast(bmi AS DECIMAL(8,3)) /  -- most recent bmi
            Min(bmi)                     -- 2nd most recent bmi
            Over (PARTITION BY id
                  ORDER BY contact_date DESC
                  ROWS BETWEEN 1 Following AND 1 Following)) - 1
          , 0)
FROM tab t
WHERE bmi IS NOT NULL
QUALIFY -- this returns the most recent row 
   Row_Number()
   Over (PARTITION BY id 
         ORDER BY contact_date DESC) = 1

这假设bmi体重指数)永远不会为零,但在您的评论中,您注意到除以零错误。您最好通过切换到WHERE bmi > 0(也排除NULL)来删除零。

或者通过像这样添加NULLIF来将零更改为NULL:

Coalesce((Cast(bmi AS DECIMAL(8,3)) /  -- most recent bmi
          NullIf(Min(bmi)                     -- 2nd most recent bmi
                 Over (PARTITION BY id
                       ORDER BY contact_date DESC
                       ROWS BETWEEN 1 Following AND 1 Following),0)) - 1
        , 0)

答案 1 :(得分:1)

您可以使用row_number函数获取前两行的值并计算百分比变化。

  <button class="navbar-toggle" type="button" data-toggle="collapse" data-target="#navbar-main">