当前位置: 首页 > 面试题库 >

GROUP BY连续日期,以空格分隔

潘意
2023-03-14
问题内容

假设(在Postgres 9.1中)有一个像这样的表:

date | value

其中有一些差距(我的意思是:并非min(date)和max(date)之间的每个可能的日期都有它的行)。

我的问题是如何汇总此数据,以便每个一致的组(不存在任何差距)被分别对待,如下所示:

min_date | max_date | [some aggregate of "value" column]

有什么想法怎么做?我相信使用窗口功能是可能的,但是尝试了一段时间后lag()lead()我有点卡住了。

例如,如果数据是这样的:

 date          | value  
---------------+-------  
 2011-10-31    | 2  
 2011-11-01    | 8  
 2011-11-02    | 10  
 2012-09-13    | 1  
 2012-09-14    | 4  
 2012-09-15    | 5  
 2012-09-16    | 20  
 2012-10-30    | 10

输出(sum作为汇总)将是:

   min     |    max     |  sum  
-----------+------------+-------  
2011-10-31 | 2011-11-02 |  20  
2012-09-13 | 2012-09-16 |  30  
2012-10-30 | 2012-10-30 |  10

问题答案:
create table t ("date" date, "value" int);
insert into t ("date", "value") values
    ('2011-10-31', 2),
    ('2011-11-01', 8),
    ('2011-11-02', 10),
    ('2012-09-13', 1),
    ('2012-09-14', 4),
    ('2012-09-15', 5),
    ('2012-09-16', 20),
    ('2012-10-30', 10);

更简单,更便宜的版本:

select min("date"), max("date"), sum(value)
from (
    select
        "date", value,
        "date" - (dense_rank() over(order by "date"))::int g
    from t
) s
group by s.g
order by 1

我的第一次尝试更加复杂和昂贵:

create temporary sequence s;
select min("date"), max("date"), sum(value)
from (
    select 
        "date", value, d,
        case 
            when lag("date", 1, null) over(order by s.d) is null and "date" is not null 
                then nextval('s')
            when lag("date", 1, null) over(order by s.d) is not null and "date" is not null 
                then lastval()
            else 0 
        end g
    from 
        t
        right join
        generate_series(
            (select min("date") from t)::date, 
            (select max("date") from t)::date + 1, 
            '1 day'
        ) s(d) on s.d::date = t."date"
) q
where g != 0
group by g
order by 1
;
drop sequence s;

输出:

    min     |    max     | sum 
------------+------------+-----
 2011-10-31 | 2011-11-02 |  20
 2012-09-13 | 2012-09-16 |  30
 2012-10-30 | 2012-10-30 |  10
(3 rows)


 类似资料:
  • 问题内容: 这是我面临的常见任务:将一个空格分隔的列表分为一个 head 元素和一个包含 tail 元素的数组。例如,给定以下字符串: 我们想要: ..在两个不同的变量中。第一个变量应为字符串,第二个变量为数组。我正在寻找一种做到这一点的 优雅 方法(最好是在Java中)。 问题答案: 对于某些高雅的价值观: 我想不出一种用更少的代码来做到这一点的方法…

  • 我从空手道功能文件中的SQL查询返回了以下日期: 但这对我不起作用。但下面的工作和返回31-00-19,但我想要31-Jan-20格式 任何帮助都将不胜感激!

  • 如何获取日期格式?

  • 问题内容: 有没有检查连续日期的功能。我在处理以下问题时遇到问题: 我的表有一个包含以下数据的列: 给定的开始日期为,结束日期为。我想要的结果是: 有人可以建议什么吗? 问题答案: 我认为这是 “连续日期分组岛” 问题的一种变体。可以使用以下方法完成: SQL小提琴 结果 这是SQL Server 2005版本: SQL小提琴

  • 从我的部署中获取最新日志-我正在处理一个错误并有兴趣在运行时了解日志-如何获取连续的日志流? 编辑:最后更正的问题。

  • 如果将块分配给文件,使得文件的所有逻辑块都得到硬盘中的连续物理块,则这种分配方案被称为连续分配。 在下面显示的图像中,目录中有三个文件。 表中提到了起始块和每个文件的长度。 我们可以在表格中检查连续块是否按照需要分配给每个文件。 优点 实现起来很简单。 可获得优秀的读取性能。 支持随机访问文件。 缺点 磁盘将变成碎片。 文件增长可能很困难。