我有表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
答案 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">