Sql 如何选择每月、每年和每周的最新条目?

Sql 如何选择每月、每年和每周的最新条目?,sql,postgresql,Sql,Postgresql,我有一个数据表历史记录。我想生成我需要的图表 每日最后一项 每周最后一次报名 每个月的最后一个条目 每年最后一次报名 根据选定的时段类型在图表上显示值 使用下面的一段sql代码,我可以每天提取最后一个条目 SELECT t.created_on, t.earned_value, t.planned_value, t.budgeted_cost FROM history t JOIN (SELECT MAX(tt.created_on) 'maxtimestamp'

我有一个数据表历史记录。我想生成我需要的图表

  • 每日最后一项
  • 每周最后一次报名
  • 每个月的最后一个条目
  • 每年最后一次报名
  • 根据选定的时段类型在图表上显示值

    使用下面的一段sql代码,我可以每天提取
    最后一个条目

    SELECT t.created_on,
         t.earned_value,
         t.planned_value,
         t.budgeted_cost
    FROM history t
    JOIN (SELECT MAX(tt.created_on) 'maxtimestamp'
    FROM history tt
    GROUP BY date(tt.created_on)) m ON m.maxtimestamp = t.created_on
    

    如何获得其他三个结果?

    您可以通过以下方法优雅地解决此问题:

    对于周和月时间段,您只需将
    提取(doy from created_on)
    参数更改为
    提取(week…
    (doy=一年中的一天,从1月1日开始计算)。对于年度数据,您只需要第一个
    提取()
    ,因此您应该删除第二个
    分区
    项。

    提取(从tt.created开始的一周)、EXTRACT(从tt.created开始的一个月)、EXTRACT(从tt.created开始的一年)
    成功了

    所以

    1-每天的最后一项

    SELECT t.created_on,
     t.earned_value,
     t.planned_value,
     t.budgeted_cost
     FROM history t
    JOIN (SELECT MAX(tt.created_on) 'maxtimestamp'
    FROM history tt
    GROUP BY EXTRACT(DAY FROM tt.created_on)) m ON m.maxtimestamp = t.created_on
    
    2-每周最后一次报名

    SELECT t.created_on,
     t.earned_value,
     t.planned_value,
     t.budgeted_cost
     FROM history t
    JOIN (SELECT MAX(tt.created_on) 'maxtimestamp'
    FROM history tt
    GROUP BY EXTRACT(WEEK FROM tt.created_on)) m ON m.maxtimestamp = t.created_on
    
    3-每个月的最后一个条目

    SELECT t.created_on,
     t.earned_value,
     t.planned_value,
     t.budgeted_cost
     FROM history t
    JOIN (SELECT MAX(tt.created_on) 'maxtimestamp'
    FROM history tt
    GROUP BY EXTRACT(MONTH FROM tt.created_on)) m ON m.maxtimestamp = t.created_on
    
    4-每年最后一次报名

    SELECT t.created_on,
     t.earned_value,
     t.planned_value,
     t.budgeted_cost
     FROM history t
    JOIN (SELECT MAX(tt.created_on) 'maxtimestamp'
    FROM history tt
    GROUP BY EXTRACT(YEAR FROM tt.created_on)) m ON m.maxtimestamp = t.created_on
    

    使用
    EXTRACT(从tt.created_on开始的一周)、EXTRACT(从tt.created_on开始的一个月)、EXTRACT(从tt.created_on开始的一年)
    对查询结果进行分组。我认为这不会起作用。如果将其更改为WEEK,则EXTRACT(从created_on开始的一周)中的日期03.01.16和03.01.15具有相同的值。它将组合来自不同时间段的值…周的分区还需要包括月和年…月的分区还必须包括年。很好的一点是,周数据不需要按月分区,因为它给出了一年中的周数。并将“天”更改为“doy”,以基于年。Answer更新
    SELECT t.created_on,
     t.earned_value,
     t.planned_value,
     t.budgeted_cost
     FROM history t
    JOIN (SELECT MAX(tt.created_on) 'maxtimestamp'
    FROM history tt
    GROUP BY EXTRACT(YEAR FROM tt.created_on)) m ON m.maxtimestamp = t.created_on