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'
最后一个条目
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