首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算每组从最后一行到第一行的百分比变化

计算每组从最后一行到第一行的百分比变化
EN

Stack Overflow用户
提问于 2020-02-12 07:27:35
回答 2查看 127关注 0票数 0

我有一个如下所示的数据集:

代码语言:javascript
复制
date    name    value
0   2018-10 A   10
1   2018-09 A   12
2   2018-10 B   33
3   2018-09 B   45
4   2018-10 C   55
5   2018-09 C   66
6   2018-10 D   0
7   2018-09 D   0

我需要计算在group by name变量之后从2018-092018-10的百分比变化。

因此,我需要一个如下所示的数据集:

代码语言:javascript
复制
    date    name    value   pctChangFromLastMonth
0   2018-10 A       10      xx
1   2018-10 B       33      xx
2   2018-10 C       55      xx
3   2018-10 D       0       xx

有人知道我如何做到这一点吗?

EN

回答 2

Stack Overflow用户

发布于 2020-02-12 08:01:35

你可以这样做:

代码语言:javascript
复制
select a.*, 100.0(a.value - b.value)/b.value as pctChangFromLastMonth
from tbl a 
inner join tbl b on a.name = b.name and a.date > b.date
票数 0
EN

Stack Overflow用户

发布于 2020-02-12 15:20:24

一种可能的方法是使用窗口函数:

表:

代码语言:javascript
复制
CREATE TABLE Data (
   [date] varchar(7),   
   [name] varchar(1),    
   [value] int
)
INSERT INTO Data
   ([date], [name], [value])
VALUES
   ('2018-10', 'A', 10),
   ('2018-09', 'A', 12),
   ('2018-10', 'B', 33),
   ('2018-09', 'B', 45),
   ('2018-10', 'C', 55),
   ('2018-09', 'C', 66),
   ('2018-10', 'D', 0),
   ('2018-09', 'D', 0)

声明:

代码语言:javascript
复制
SELECT
   [date],
   [name], 
   [value],
   CASE
      WHEN [prevvalue] = 0 THEN 0.0
      ELSE 100.0 * ([value] - [prevvalue]) / [prevvalue]
   END AS pctChangFromLastMonth,
   CASE
      WHEN [firstvalue] = 0 THEN 0.0
      ELSE 100.0 * ([value] - [firstvalue]) / [firstvalue]
   END AS pctChangFromFirstMonth
FROM (   
   SELECT
      [date],
      [name],
      [value],
      LAG([value]) OVER (PARTITION BY [name] ORDER BY [date]) AS [prevvalue],
      FIRST_VALUE([value]) OVER (PARTITION BY [name] ORDER BY [date]) AS [firstvalue],
      ROW_NUMBER() OVER (PARTITION BY [name] ORDER BY [date] DESC) AS [rn]
   FROM Data
) t
WHERE t.[rn] = 1

结果:

代码语言:javascript
复制
----------------------------------------------------------------------
date    name    value   pctChangFromLastMonth   pctChangFromFirstMonth
----------------------------------------------------------------------
2018-10 A       10           -16.666666666666         -16.666666666666
2018-10 B       33           -26.666666666666         -26.666666666666
2018-10 C       55           -16.666666666666         -16.666666666666
2018-10 D       0              0.000000000000           0.000000000000
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60178868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档