首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算百分比随时间的变化

计算百分比随时间的变化
EN

Stack Overflow用户
提问于 2014-03-06 16:38:08
回答 1查看 751关注 0票数 1

我已经创建了结构和示例数据这里。我不知道如何计算时间的变化。

我想要的结果集是:

代码语言:javascript
复制
a   | % growth
abc | 4.16
def | 0.83
hig | -0.2

% change是(最后一个值-第一个值)/天:

代码语言:javascript
复制
a   | % growth
abc | (30-5) / 6
def | (6-1) / 6
hig | (4-5) / 5

我在努力:

代码语言:javascript
复制
SELECT a.*, 
       b.val, 
       c.val 
FROM   (SELECT a, 
               Min(dt) AS lowerDt, 
               Max(dt) AS upperDt 
        FROM   tt 
        GROUP  BY a) a 
       LEFT JOIN tt b 
              ON b.dt = a.lowerdt 
                 AND b.a = a.a 
       LEFT JOIN tt c 
              ON c.dt = a.upperdt 
                 AND b.a = a.a 

如果可能的话,我想避免做CTE。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-06 16:53:13

你不想要minmax,你真的想要firstlast

我这样做的一种方法是使用ROW_NUMBER()来告诉我从开始到结束的位置。然后使用MAX(CASE WHEN pos=1 THEN x ELSE null END)获取我想要的值。

代码语言:javascript
复制
SELECT
  a,
  MAX(CASE WHEN pos_from_first = 1 THEN dt  ELSE NULL END)  AS first_date,
  MAX(CASE WHEN pos_from_final = 1 THEN dt  ELSE NULL END)  AS final_date,
  MAX(CASE WHEN pos_from_first = 1 THEN val ELSE NULL END)  AS first_value,
  MAX(CASE WHEN pos_from_final = 1 THEN val ELSE NULL END)  AS final_value,
  100
  *
  CAST(MAX(CASE WHEN pos_from_final = 1 THEN val ELSE NULL END) AS DECIMAL(9,6))
  /
  CAST(MAX(CASE WHEN pos_from_first = 1 THEN val ELSE NULL END) AS DECIMAL(9,6))
  -
  100                                                       AS perc_change
FROM
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY a ORDER BY dt  ASC) AS pos_from_first,
    ROW_NUMBER() OVER (PARTITION BY a ORDER BY dt DESC) AS pos_from_final,
    *
  FROM
    tt
)
  AS ordered
GROUP BY
  a

http://sqlfiddle.com/#!6/ad95d/11

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22230528

复制
相关文章

相似问题

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