Teradara SQL-具有最大-最小日期的操作

时间:2019-05-29 21:23:45

标签: sql teradata

假设我在Reradata SQL中具有以下数据框。 如何在用户级别获取最高日期和最低日期之间的差异?问候

Initial table
   user    date   price
    1       1-1       10
    1       2-1       20
    1       3-1       30 
    2       1-1       12
    2       2-1       22
    2       3-1       32 
    3       1-1       13
    3       2-1       23
    3       3-1       33

 Final table

user   var_price
1       30/10-1
2       32/12-1
3       33/13-1

3 个答案:

答案 0 :(得分:1)

这是您想要的吗?

select user, max(price) / min(price) - 1
from t
group by user;

您的值是单调递增的,因此max()min()似乎是最简单的解决方案。

编辑:

您可以使用窗口功能:

select user, max(last_price) / max(first_price) - 1
from (select t.*,
             first_value(price) over (partition by user order by date rows between unbounded preceding and current_row) as first_price,
             first_value(price) over (partition by user order by date desc rows between unbounded preceding and current_row) as last_price
      from t
     ) t
group by user;

答案 1 :(得分:1)

试试这个-

SELECT B.[user],
CAST(SUM(B.max_price) AS VARCHAR)+'/'+CAST(SUM(B.min_price) AS VARCHAR)+ '-1' var_price,
SUM(B.max_price)/SUM(B.min_price) -1 calculated_var_price
FROM
(
    SELECT *    FROM 
    (
        SELECT [user],0 max_price,price min_price,ROW_NUMBER() OVER (PARTITION BY [user] ORDER BY DATE)  RN
        FROM your_table
    )A WHERE RN = 1

    UNION ALL

    SELECT * FROM 
    (
        SELECT [user],price max_price,0 min_price, ROW_NUMBER() OVER (PARTITION BY [user] ORDER BY DATE DESC)  RN
        FROM your_table
    )A WHERE RN = 1
)B
GROUP BY B.[user]

输出为-

user    var_price    calculated_var_price
1       30/10-1      2
2       32/12-1      1
3       33/13-1      1

答案 2 :(得分:1)

select user
  ,price as first_price
  ,last_value(price)
   over (paritition by user
         order by date
         rows between unbounded preceding and unbounded following) as last_price
from mytab
qualify 
  row_number() -- lowest date only
  over (paritition by user
        order by date) = 1

这将返回日期最少的行,并加上最新日期的价格