2017-02-10 1 views
2

Я пытаюсь получить запись, которая содержит максимальную временную метку каждый месяц в году.postgresql query - найти максимальную временную метку для каждого месяца

Для этого я создал временную таблицу (date_series) с каждым месяцем с января 2016 года по сегодняшний день. Я хочу найти максимальную временную метку для каждого идентификатора за каждый месяц года и показать соответствующий идентификатор и статус.

Это то, что я до сих пор: Поле createddate является

with date_series as(
    SELECT * FROM generate_series('2016-01-01'::date, 
           now(), '1 month') 
) 
select max(a.created_at), a.id, d.generate_series, a.status 
from sales a, date_series d 
group by 2,3,4 

Однако я не уверен, как структурировать запрос логически для достижения этих результатов.

+0

Я думаю, мне нужно добавить дополнительный подзапрос, чтобы найти 'макс (a.created_at)' дату, а затем присоединиться, что с временным таблица даты. – OAK

ответ

1

Предполагая, что вы не имеете пробелы в вашем месяце (или не волнует), и временные метки действительно уникальны, это должно работать:

with salez as (
    select 
    id, status, created_at, 
    max (created_at) over (partition by date_trunc ('month', created_at)) as max_date 
    from 
    sales 
) 
select 
    max_date, id, date_trunc ('month', created_at)::date, status 
from salez 
where 
    max_date = created_at 

риск с max в том, что если вы можете иметь две записи с точно такой же timesta mp, это даст вам две записи вывода за этот месяц. Если это возможно, и нарушит ваш запрос, используйте row_number вместо:

with salez as (
    select 
    id, status, created_at, 
    row_number() over (partition by date_trunc ('month', created_at 
     order by id desc)) as rn 
    from 
    sales 
) 
select 
    created_at, id, date_trunc ('month', created_at)::date, status 
from salez 
where 
    rn = 1 
+0

Ваш 'порядок по id desc' не обязательно присваивает row_number 1 максимальной строке временной метки для каждого раздела, как запрошено OP. Я предлагаю использовать sth как 'row_number() over (partition by date_trunc ('month', created_at) order by created_at desc) как rn'. – dnswlt

Смежные вопросы