GROUP BY 由间隙分隔的连续日期

2023-11-27

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

date | value 

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

我的问题是如何聚合这些数据,以便单独处理每个一致的组(没有间隙),如下所示:

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

有什么想法如何去做吗?我相信窗口函数是可能的,但是经过一段时间的尝试lag() and 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GROUP BY 由间隙分隔的连续日期 的相关文章

  • REASSIGN OWNED BY 为 1 个指定数据库

    我想使用以下命令更改一个特定数据库中所有表的所有者 REASSIGN OWNED BY postgres TO myuser 但它显示 ERROR cannot reassign ownership of objects owned by
  • 为什么我们不能有多个主键?

    我知道表中不能有超过 1 个主键 但技术原因是什么 直接拉取自SO https stackoverflow com questions 217945 can i have multiple primary keys in a single
  • 使用另一个表中的数据查找并替换 MySQL 中的字符串

    我有两个 MySQL 表 我想使用另一个表中的数据查找和替换一个表中的文本字符串 Table texts messages thx guys i think u r great thx again u rock Table dictiona
  • 为什么 sql 字段名称中不应该包含逗号?

    人们一直告诉我列名中不应包含空格 我只是想知道 这是为什么 这是我为学校创建的一些数据库表遇到的问题 字段名称包括 Preble 和 Darke 相反 它们需要是 普雷布尔县 俄亥俄州 和 达克县 俄亥俄州 如果它们是行名称 我只需创建一个
  • 使用连接查询检索行

    我有两张这样的桌子 A B col1 col2 col1 col2 一个表包含 300k 行 B表包含400k行 如果表 A 的 col1 与表 B 的 col1 匹配 我需要计算它 我写了一个这样的查询 select count dist
  • Rails 多租户架构,限制多个租户的访问范围

    目前我们有一个单租户数据库架构 MySQL 运行着超过 100 个数据库 我们使用 Apartment gem 切换子域上的数据库连接 一切都很顺利 然而 我们现在需要创建所谓的 伞 客户端 它可以访问一组现有客户端的所有数据 我不认为这对
  • Postgresql 中的 id 列位置重要吗?

    我正在测试删除主键列 id 的迁移 我想使用外键作为主键 当我运行并恢复迁移时 我看到表的状态是相同的 只是 id 列现在是最后一个 它会以任何方式改变我的数据库的行为吗 我是否应该费心去恢复迁移恢复代码中的列顺序 理论上一切都应该没问题
  • 从备份恢复 PostgreSQL 数据库,没有外键约束问题

    我有一个包含大约 85 个以上表的 postgresql 数据库 我定期使用pg dump 通过 php pgadmin 在复制模式下 备份文件的大小几乎为 10 12 MB 现在我面临的问题是 每当我尝试恢复数据库时 都会出现外键约束问题
  • 使用MySQL计算单个表中借方和贷方的余额

    下面的 MySQL 表包含带有关联金额的借方或贷方 操作 如何选择具有非零 余额 的所有 CLIENT ID 我尝试将表连接到自身以计算所有借方和贷方总额 但有些东西无法正常工作 CLIENT ID ACTION TYPE ACTION A
  • 在 postgresql 9.4 或 9.5 中查询 json 对象的嵌套数组中的元素

    studentID 1 StudentName jhon Data schoolname school1 enrolmentInfo year 2015 info courseID csc213 school IT enrollmentda
  • POSTGRESQL:如何在现有表上添加包含数据的新列

    我是 postgres 和 sql 脚本的新手 所以请耐心等待 我想要做的是在现有表上添加包含数据的现有列 现有表的示例 NAME AGE Adam 25 Tim 30 现在我想添加一个新列 ADDRESS 其中包含 Adam 和 Tim
  • 即使将“enable_seqscan”设置为关闭后,也未使用数组列上的 GIN 索引?

    根据推荐this https stackoverflow com questions 4058731 can postgresql index array columns comment10357041 4059785评论 我建立了一个 i
  • Rails csv 格式的原始查询,通过控制器返回

    我使用 Active Record 来获取我的故事 然后生成 CSV 这是在 Rails Cast 中完成的标准方法 但我有很多行 需要几分钟 我想如果我能让 posgresql 来做 csv 渲染 那么我可以节省一些时间 这是我现在所拥有
  • 如何在数据库中存储年月?

    是否有在数据库中存储年份和月份的标准方法 我需要根据月份和年份制作一些报告 我无法使用日期和函数实时提取月份 因为表很大 所以我需要预处理 我会和 Michael 的建议是什么 https stackoverflow com a 81694
  • SQL Server 相当于 MySQL 的 USING

    在 MySQL 中 当您连接不同表中具有相同名称的列时 可以在连接中使用关键字 USING 例如 这些查询产生相同的结果 SELECT FROM user INNER JOIN perm USING uid SELECT FROM user
  • SQL Server 转换选择一列并将其转换为字符串

    是否可以编写一条从表中选择列并将结果转换为字符串的语句 理想情况下 我希望有逗号分隔的值 例如 假设 SELECT 语句看起来像这样 SELECT column FROM table WHERE column lt 10 结果是一列包含值的
  • Yii 查询时对相关模型的限制

    我遇到了极限问题 我正在使用的代码如下 model PostCategory model record model gt with array posts gt array order gt posts createTime DESC li
  • 累计非重复计数

    我正在查询每天获取 uid 的累计不同计数 示例 假设有 2 个 uid 100 200 出现在日期 2016 11 01 并且它们也在第二天出现 新的 uid 300 100 200 300 出现在 2016 11 02 此时我希望商店累
  • 如何在动态查询中将行值连接到列名

    我正在开发一个允许配置问题和答案的应用程序 目前最多可以有 20 个答案 但也可能更少 我的结构如下 问题 ID FormId QuestionText AnswerField 1 1 Name Answer01 2 1 Address A
  • 通过将行旋转为动态数量的列来在 MySQL 中创建摘要视图

    我在 MySQL 中有一个表 其中包含以下字段 id company name year state 同一客户和年份有多行 以下是数据示例 id company name year state 1 companyA 2008 1 2 com

随机推荐

  • 防止sequelize在node.js应用程序中删除数据库

    首先 我使用带有sequelize ORM 和Postgresql 的node js 我有两个简单的问题 每次我重新运行节点应用程序时 sequelize 都会删除并创建数据库中的所有表 如何防止它这样做 我不想删除数据库中的记录 我尝试设
  • 如何使用 jQuery 找到“ul”中的最后一个“li”?

    我想检查li这是最后一个li in ul 我如何使用 jQuery 检查这一点 ul li value class selected 1 li li value 2 li li value 3 li li value 4 li li val
  • 如何在整个应用程序中显示底部的迷你控制器或持久媒体控件(例如 Spotify 或 Google 音乐)[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在开发一个应用程序 可以播放来自 youtube 或其他实时流媒体的视频 如果用户按下后退 主页按钮 用户只能听到音频 然后他们可以返回再次观看视频 我创建了一个可以容纳玩家
  • 如何对 Scala 数组的每一列求和?

    如果我在 Scala 中有一个数组的数组 类似于矩阵 那么对矩阵的每一列求和的有效方法是什么 例如 如果我的数组数组如下所示 val arr Array Array 1 100 Array 2 200 Array 3 300 我想对每一列求
  • 计算文件复制的剩余时间

    我有一个应用程序 可以通过网络将大量文件复制到文件服务器 不是网络 我试图显示对剩余时间的一半不错的估计 我看过很多关于SO的文章 但问题没有得到解决 但我没有尝试真正做我想做的事情 我希望估计的剩余时间相对稳定 即不会根据波动的传输速度到
  • 从字符串中删除引号

    所以我认为这只是一个简单的问题 但我得到了不正确的结果 基本上我试图删除字符串周围的引号 例如 我有字符串 01 00 我想要 01 00 下面是我认为如何能够做到这一点的代码 expected start time conditions
  • WM_COMMAND 在 C++ win32 中捕获按钮按下

    我正在尝试使用 c win32 获取按钮按下事件WM Command HWND hBtn HWND hBtnParent HWND UploadVideo HWND SelectVideoBTN UploadBTN HWND hWnd HI
  • 将 Interface Builder 中创建的 UITabBarController 设置为委托

    我使用选项卡栏模板创建了 iOS 应用程序 因此这里是带有栏按钮的 UITabBarController 一个问题是如何将其设置为委托 我发现它必须在 AppDelegate 中以编程方式设置 但我相信这是不可能的 因为我无法访问选项卡栏控
  • Python:从数字列表中删除负数

    问题是从数字中删除负数 When remove negs 1 2 3 3 6 1 3 1 执行后 结果为 1 2 3 6 3 1 结果应该是 1 2 3 6 3 1 发生的情况是 如果连续有两个负数 例如 1 3 那么第二个数字将不会被删除
  • 如何以编程方式更改 C# 中的程序集名称

    我想在 C 中以编程方式更改程序集的名称 有一种方法可以从项目属性中更改它 但我想以编程方式更改它 以便更改我的输出 exe 名称 任何技巧 您可以在构建后事件中执行此操作 这些脚本是在构建过程完成后执行的命令行脚本 ren TargetF
  • 如何对对象的属性值求和?

    我想对以下属性值进行求和PieData 我的预期输出是25515512 916952499 942468011 var PieData value 25515512 color 00a65a highlight 00a65a label R
  • HTML/CSS:使 div 对点击“不可见”?

    由于各种原因 我需要放置一个 大部分 透明的 div 在一些文字上 但是 这意味着无法单击文本 例如 单击链接或选择它 是否可以简单地使该 div 对于单击和其他鼠标事件 不可见 例如 overlaydiv 覆盖了文本 但我希望能够通过单击
  • 剃刀视图 » 字符呈现为 »

    字符似乎在剃刀视图中渲染为 我努力了 and Html Raw 但问题并没有消失 我对 ASPX 视图没有这个问题 另外 文化被设定为
  • Python-docx - 如何更改表格字体大小?

    table document add table rows 1 cols 1 hdr cells table rows 0 cells hdr cells 0 text Qty 我必须更改一行一列表格中文本 数量 的字体大小 我该怎么做 您
  • 依赖注入和单例设计模式

    我们如何确定何时使用依赖注入或单例模式 我在很多网站上读过 他们说 使用依赖注入而不是单例模式 但我不确定我是否完全同意他们的观点 对于我的中小型项目 我肯定会直接使用单例模式 例如记录器 我可以用Logger GetInstance Lo
  • 在 Python 中迭代一系列日期

    我有以下代码可以做到这一点 但我怎样才能做得更好呢 现在我认为它比嵌套循环更好 但是当你在列表理解中有一个生成器时 它开始变得 Perl one linerish day count end date start date days 1 f
  • 如何使用Spring 3.x开发https站点?

    我是基于 Spring 的 Web 开发的新手 我们的网站是基于 Spring 的 目前是基于 http 的 所以相当不安全 由于该网站尚未上线 我们也通过正常的 JSON 请求向服务器发送登录名 密码 并且主要关注 JSP UI 设计 S
  • 选择不使用表格的两个日期之间的所有日期(生成日期列表)

    有没有一种方法可以在不使用任何 MySQL 表的情况下获取两个日期之间的所有日期 就像是 SELECT date BETWEEN 2012 02 10 AND 2012 02 15 这会导致这样的结果 out put date list 2
  • 设计邀请批量邀请 - Ruby on Rails

    我正在尝试使用 Devise invitable 来一次添加多个用户 基本上 当有人创建帐户时 他们要做的第一件事就是使用可邀请的表单添加一堆用户 只是不确定如何复制表单中的字段并让他们为每个条目发送创建请求 提前致谢 我就是这样做的 提供
  • GROUP BY 由间隙分隔的连续日期

    假设你 在 Postgres 9 1 中 有一个像这样的表 date value 其中有一些间隙 我的意思是 并非 min date 和 max date 之间的每个可能日期都有它的行 我的问题是如何聚合这些数据 以便单独处理每个一致的组