Teradara SQL - работа с максимальными и минимальными датами - PullRequest
0 голосов
/ 30 мая 2019

предположим, у меня есть следующий фрейм данных в 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 ]

1 голос
/ 30 мая 2019

Попробуйте это-

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
1 голос
/ 30 мая 2019
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

Возвращает строку с самой низкой датой и добавляет цену самой последней даты

1 голос
/ 30 мая 2019

Это то, что вы хотите?

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

Ваши значения монотонно растут, поэтому max() и min() кажутся простейшим решением.

EDIT:

Вы можете использовать оконные функции:

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;
...