如何检索每周的第一行

时间:2018-11-05 15:33:50

标签: sql postgresql greatest-n-per-group

我有一张看起来像这样的桌子

foo_date   | bar 
---------------
2018-01-01 | bar
2018-01-09 | bar
2018-01-10 | bar
2018-01-20 | bar

我想建立一个请求,该请求针对每个星期检索一周中最先出现的行。

欢呼

2 个答案:

答案 0 :(得分:2)

demo:db<>fiddle

SELECT DISTINCT ON (year, week)
    foodate, bar
FROM (
    SELECT
        foodate,
        bar,
        EXTRACT('isoyear' FROM foodate) as year,
        EXTRACT('week' FROM foodate) as week
    FROM dates
    ORDER BY foodate
)s

EXTRACT('week'...)给出星期。因此,同一周中的两个日期在此列中的输出相同。

DISTINCT ON (week)给出每周的第一行(已排序!)。

Postgres Date functions

注意周的定义:

  

ISO 8601的星期编号,是一年中的第几周。通过   定义,ISO周从一年的星期一和一年的第一周开始   包含该年的1月4日。换句话说,是   一年是在该年的第1周。


编辑:如果您拥有多于一年的数据,那么当然也应该添加年份。否则,例如,您将获得所有年份所有第一周的第一行。

答案 1 :(得分:2)

您可以简单地做到:

select distinct on (datetrunc('week', foo_date)) t.*
from t
order by datetrunc('week', foo_date), foo_date;