postgresql 如何对表进行分区以获取每个月的第一个数据?

vuv7lop3  于 2023-01-30  发布在  PostgreSQL
关注(0)|答案(1)|浏览(152)
CREATE TABLE employee
(
    joining_date date,
    employee_type character varying,
    name character varying ,
  typeid integer
);
insert into employee VALUES
    ('2021-08-12','as','hjasghg', 1),
    ('2021-08-13', 'Rs', 'sa', 1),
    ('2021-08-14','asktyuk','hjasg', 1),
  ('2021-09-12','as','hjasghg', 1),
    ('2021-09-13', 'Rs', 'sa', 1),
    ('2021-09-14','asktyuk','hjasg', 1),
  ('2022-08-02','as','hjasghg', 2),
    ('2022-08-03','as','hjasghg', 2),
    ('2022-08-04', 'Rs', 'sa', 2),
    ('2022-08-05','asktyuk','hjasg', 2);

我想获得包含不同类型ID的每个月的第一个数据的阅读的列。
我试过应用分区,但似乎无法提取正确的数据。

with cte_a as
    (select row_number() over (partition by typeid order by joining_date asc) sno, * from employee)
    select * from cte_a where sno = 1;

我期望从日期'2021-09-12''2021-08-12''2022-08-02'得到结果,但最终结果中只得到了'2022-08-02''2021-08-12'

e0bqpujr

e0bqpujr1#

demo:db<>fiddle
您可以将DISTINCT ONdate_part()函数结合使用

SELECT DISTINCT ON (typeid, date_part('month', joining_date))
    *
FROM employee
ORDER BY typeid, date_part('month', joining_date)
  1. date_part('month', ...)将日期“标准化”为一个月的第一天(或者如果您愿意,可以去掉日部分)
  2. DISTINCT ON返回所有有序组中的第一个,在这种情况下,返回typeid和规范化日期的组

相关问题