我有一张看起来像这样的桌子
foo_date | bar
---------------
2018-01-01 | bar
2018-01-09 | bar
2018-01-10 | bar
2018-01-20 | bar
我想建立一个请求,该请求针对每个星期检索一周中最先出现的行。
欢呼
答案 0 :(得分:2)
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)
给出每周的第一行(已排序!)。
注意周的定义:
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;