【问题标题】:How to select latest entry per month, per year and per week?如何选择每月、每年和每周的最新条目?
【发布时间】:2016-08-28 11:00:36
【问题描述】:

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

  1. 每天的最后一个条目
  2. 每周最后一次报名
  3. 每个月的最后一个条目
  4. 每年的最后一个条目

根据选定的周期类型在图表上显示值。

通过下面这段sql代码,我可以获取last entry per day

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

我怎样才能得到其他三个结果?

【问题讨论】:

  • 使用EXTRACT(WEEK FROM tt.created_on), EXTRACT(month FROM tt.created_on),EXTRACT(year FROM tt.created_on) 对查询结果进行分组。

标签: sql postgresql


【解决方案1】:

您可以使用window function 非常优雅地解决这个问题:

SELECT created_on, earned_value, planned_value, budgeted_cost
FROM (
  SELECT created_on, earned_value, planned_value, budgeted_cost,
         rank() OVER (PARTITION BY extract(year from created_on),
                                   extract(doy from created_on)
                      ORDER BY created_on DESC) r
  FROM history) sub
WHERE r = 1
ORDER BY created_on;

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

【讨论】:

  • 我认为这行不通。如果将其更改为一周,则日期 03.01.16 和 03.01.15 具有相同的提取值(来自 created_on 的周)。它将结合来自不同时间段的值...周分区还需要包括月份和年份...月份分区也必须包括年份。
  • 好点,除了周数据不必按月分区,因为它给出了一年中的周数。并将“day”更改为“doy”以基于年份。答案已更新
【解决方案2】:

EXTRACT(WEEK FROM tt.created_on), EXTRACT(month FROM tt.created_on),EXTRACT(year FROM tt.created_on) 成功了。

所以,

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    相关资源
    最近更新 更多