Максимальное значение по идентификатору, дате и последним x дням - PullRequest
0 голосов
/ 07 мая 2019

Предположим, у меня есть таблица:

 ---------------
 id |  date | value
------------------
  1 |  Jan 1 | 10
  1 |  Jan 2 | 12
  1 |  Jan 3 | 11
  2 |  Jan 4 | 11

Мне нужно получить максимальное и медианное значение каждого идентификатора, каждой даты, каждой за последние 90 дней. Я использую запрос:

select id, date, value
max(value) over (partition by id, date) as max_date,
median(value) over (partition by id, date) as med_date
from table
where date > date - interval '90 days'

Я пытался экспортировать данные и проверить вручную, но результат не верный. Что-то, что я пропустил? спасибо

ожидаемый результат - получить максимальное значение за последние 90 дней. например, дата 5 апреля, тогда она найдет максимальное значение с 5 января (последние 90 дней) до 5 апреля. и затем дата перемещается на 6 апреля, затем она будет повторяться с 6 января до 6 апреля и так далее для каждого идентификатора

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Почему вы используете оконные функции?Это похоже на то, что вы описываете:

select id,
       max(value) as max_date,
       percentile_disc(0.5) within group (order by value) as median_value
from table
where date > date - interval '90 days';

Если вы хотите это на дату , используйте оконные функции:

select t.*
from (select t.*,
             max(value) over (order by date range between '89 day' preceding and current row) as running_max_value,
             percentile_disc(0.5) within group (order by value) range between '89 day' preceding and current row) as running_median_value
      from t
     ) t
where date > date - interval '90 days';

Фильтр находится во внешнем запросетак что предыдущий период может вернуться во времени.

0 голосов
/ 07 мая 2019

Так что я предполагаю, что вы можете получить несколько значений для одного и того же идентификатора и даты и правильно? в противном случае разделение идентификатора и даты не имеет смысла

SELECT id, date, max(value), avg(value) from table where date > date - interval '90 days'
group by id, value

'group by' делает разбиение

...