2017-02-10 214 views
2

我想檢索包含一年中每個月的最大時間戳的記錄。postgresql查詢 - 找到每個月的最大時間戳

爲此,我從2016年1月至今的每個月都創建了一個臨時表(date_series)。我想爲每個月的每個ID找到最大時間戳,並顯示相應的ID和狀態。

這是我到目前爲止有: 的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

我想我需要添加一個額外的子查詢找到'MAX(a.created_at)'日期,然後加入與臨時日期表。 – OAK

回答

1

閱讀有關DISTINCT ONhttp://www.postgresqltutorial.com/postgresql-select-distinct/

試試這個

SELECT DISTINCT ON(a.id, a.status, date_trunc('month',cdate)) 
     a.id, 
     a.status, 
     date_trunc('month',cdate) "Month", 
     a.created_at 
FROM sales a 
ORDER BY a.id, a.status, date_trunc('month',cdate), created_at DESC 
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排序'不一定將row_number 1分配給每個分區的最大時間戳行,如OP請求。我建議像row_number()一樣使用(由date_trunc分區('month',created_at)按照created_at desc分區)作爲rn'。 – dnswlt