【问题标题】:query get every last date on a month查询获取一个月的最后一个日期
【发布时间】:2021-06-07 04:39:16
【问题描述】:

我有一张这样的桌子

date amount
2021-01-01 100
2021-01-15 200
2021-01-31 300
2021-02-01 400
2021-02-15 500
2021-02-28 600
2021-03-01 700
2021-03-02 800
2021-03-03 900

我想创建一个这样的报告

date amount
2021-01-31 300
2021-02-28 600
2021-03-03 900

我很困惑如何创建一个查询来提供这样的数据,在一个月的每个最后一个日期获取金额。

假设我在 2021 年 3 月 4 日输入了一个金额,报告将显示这样的数据

date amount
2021-01-31 300
2021-02-28 600
2021-03-04 1000

我正在使用 PostgreSQL

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    demo:db<>fiddle

    要查找群组的最新记录,您可以使用DISTINCT ON

    SELECT DISTINCT ON (date_trunc('month', my_date))
        *
    FROM mytable
    ORDER BY date_trunc('month', my_date), my_date DESC
    
    1. date_trunc('month', ...) 将日期标准化为一个月的第一天。所以二月内的每个日期都将转换为'2021-02-01'。这可以使用一组几个月
    2. 按实际date DESC 对这些组进行排序,这会将最近的日期排序到月份组的顶部。 DISTINCT ON 准确返回此记录。

    【讨论】:

    • 补充说明
    【解决方案2】:

    你可以用 row_number() 做到这一点:

    **Schema (PostgreSQL v13)**
    
    CREATE TABLE tablename (
        date date,
        amount int
    );
    
    INSERT INTO tablename VALUES
    ('2021-01-01',  100),
    ('2021-01-15',  200),
    ('2021-01-31',  300),
    ('2021-02-01',  400),
    ('2021-02-15',  500),
    ('2021-02-28',  600),
    ('2021-03-01',  700),
    ('2021-03-02',  800),
    ('2021-03-03',  900),
    ('2021-03-04',  1000);
    

    查询 #1

    select date,amount from 
    (
      select date,amount ,
      row_number()over (partition by (extract (year from date)),(extract (month from date )) order by date desc)RN
           from tablename
    )T
    WHERE RN=1;
    
    date amount
    2021-01-31T00:00:00.000Z 300
    2021-02-28T00:00:00.000Z 600
    2021-03-04T00:00:00.000Z 1000

    View on DB Fiddle

    【讨论】:

    • 对不起。这是一个错字。已更正。
    • 由于实际数据中同一个月可以存在多年,因此我将年份和月份一起用于按子句进行分区。
    【解决方案3】:
    select date_trunc('month', date + '01 Months'::interval) - '01 Days'::interval, sum(amount) 
    from tableName
    group by date_trunc('month', date + '01 Months'::interval) - '01 Days'::interval
    order by date_trunc('month', date + '01 Months'::interval) - '01 Days'::interval desc
    

    【讨论】:

      猜你喜欢
      • 2012-05-29
      • 2019-09-13
      • 2013-06-23
      • 2023-02-08
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      相关资源
      最近更新 更多