Postgres 中动态基数的累积添加

2024-01-29

我在 Postgres 中有以下场景(我正在使用9.4.1).

我有一个这种格式的表:

create table test(
    id serial,
    val numeric not null,
    created timestamp not null default(current_timestamp),
    fk integer not null
);

然后我拥有的是threshold numeric另一个表中的字段应用于标记每一行test。对于每个值>= threshold我想将该记录标记为true但如果是的话true它应该在此时将后续计数重置为 0,例如

数据集:

insert into test(val, created, fk)
  (100, now() + interval '10 minutes', 5),
  (25,  now() + interval '20 minutes', 5),
  (30,  now() + interval '30 minutes', 5),
  (45,  now() + interval '40 minutes', 5),
  (10,  now() + interval '50 minutes', 5);

当阈值为 50 时,我希望得到的输出为:

100 -> true (as 100 > 50) [reset]
25  -> false (as 25 < 50)
30  -> true (as 25 + 30 > 50) [reset]
45  -> false (as 45 < 50)
10  -> true (as 45 + 10 > 50)

是否可以在单个 SQL 查询中完成此操作?到目前为止,我已经尝试过使用窗函数 http://www.postgresql.org/docs/current/static/tutorial-window.html.

select t.*,
       sum(t.val) over (
         partition by t.fk order by t.created
       ) as threshold_met
from test t
where t.fk = 5;

正如你所看到的,我已经达到了累积频率的地步,并怀疑对rows between x preceding and current row可能就是我正在寻找的。我只是不知道如何执行重置,即设置x,将上面的值改为适当的值。


创建您自己的聚合函数 https://www.postgresql.org/docs/current/sql-createaggregate.html,可以用作窗函数。

专门的聚合函数

这比人们想象的要容易:

CREATE OR REPLACE FUNCTION f_sum_cap50 (numeric, numeric)
  RETURNS numeric LANGUAGE sql AS
'SELECT CASE WHEN $1 > 50 THEN 0 ELSE $1 END + $2';

CREATE AGGREGATE sum_cap50 (numeric) (
  sfunc    = f_sum_cap50
, stype    = numeric
, initcond = 0
);

Then:

SELECT *, sum_cap50(val) OVER (PARTITION BY fk
                               ORDER BY created) > 50 AS threshold_met 
FROM   test
WHERE  fk = 5;

结果完全符合要求。

db<>fiddle
Old sqlfiddle http://sqlfiddle.com/#!17/78ea6/1

通用聚合函数

为了让它工作任何阈值 and 任何(数字)数据类型,并且allow NULL values:

CREATE OR REPLACE FUNCTION f_sum_cap (anyelement, anyelement, anyelement)
  RETURNS anyelement
  LANGUAGE sql STRICT AS
$$SELECT CASE WHEN $1 > $3 THEN '0' ELSE $1 END + $2;$$;

CREATE AGGREGATE sum_cap (anyelement, anyelement) (
  sfunc    = f_sum_cap
, stype    = anyelement
, initcond = '0'
);

然后,以任何数字类型的限制(例如 110)进行调用:

SELECT *
     , sum_cap(val, '110') OVER (PARTITION BY fk
                                 ORDER BY created) AS capped_at_110
     , sum_cap(val, '110') OVER (PARTITION BY fk
                                 ORDER BY created) > 110 AS threshold_met 
FROM   test
WHERE  fk = 5;

db<>fiddle
Old sqlfiddle http://sqlfiddle.com/#!17/b8894/2

解释

在你的情况下,我们不必防御NULL值自val被定义为NOT NULL. If NULL可以参与、定义f_sum_cap() as STRICT它之所以有效是因为(根据文档 https://www.postgresql.org/docs/current/sql-createaggregate.html):

如果状态转换函数被声明为“严格”,那么它不能 使用空输入调用。有了这样的转换函数,聚合 执行行为如下。具有任何空输入值的行是 被忽略(该函数未被调用并且先前的状态值是 保留)[...]

函数和聚合都多了一个参数。为了多态性 https://www.postgresql.org/docs/current/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC变体它可以是硬编码数据类型或多态类型作为主要参数。

关于多态函数:

  • 聚合多维数组的函数中的初始数组 https://stackoverflow.com/questions/9832973/initial-array-in-function-to-aggregate-multi-dimensional-array/9845460#9845460

注意使用无类型字符串文字,不是数字文字,默认为integer!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Postgres 中动态基数的累积添加 的相关文章

  • Rails 中 WHERE 子句中的 ALL 运算符

    关联关系如下图所示 InstructorStudent has many fees Fee belongs to instructor student 我想要获得在所有给定数组中具有每月详细信息的指导学生 如果其中任何一个中不存在每月详细信
  • 限制分页页数

    objConnect mysql connect localhost root or die mysql error objDB mysql select db Test strSQL SELECT FROM UserAddedRecord
  • 如何修复“缺少表的 FROM 子句条目”错误

    我正在尝试根据游戏 ID 获取平台名称 我有如下三个表 我正在尝试加入它们以获得所需的结果 Games Id 1 2 3 4 Game Platforms Id game id platform id 1 1 1 2 1 2 3 3 3
  • mysql 详细查询字符串,如通配符

    不知道如何标题我的问题 哈哈 下面是我需要的 我的数据库中的值如下所示 test example 1 test example 2 test example TD 1 这些值的长度可以不同 test example 只是一个示例 某些值将具
  • SQL中如何识别字符串的第一个字符是数字还是字符

    我需要将数据中的第一个字符识别为 SQL Server 中的数字或字符 我对此比较陌生 我不知道从哪里开始 但这是我到目前为止所做的事情 我的数据看起来像这样 TypeDep Transfer From 4Z2 Transfer From
  • 使用 SQL 完全复制 postgres 表

    免责声明 这个问题和栈溢出问题类似here https stackoverflow com questions 198141 copy a table including indexes in postgres 但这些答案都不适用于我的问题
  • 连接 3 三张表

    我有这个图表应该可以解释我的情况 我需要一些关于连接 3 个表的帮助 我不知道如何做这种事情 因此 我可以通过执行以下操作来经历一段检索记录的 while 循环 img src alt Album AlbumID 使用内部联接 http w
  • 使用所有连接的 Flask unittest 和 sqlalchemy

    在进行了大约 100 个单元测试后 我刚刚在 Flask 应用程序上运行单元测试时遇到了问题 所有单元测试都会通过 但是当一次全部运行时 它们将失败并出现以下错误 OperationalError OperationalError FATA
  • 使用“AND”表达式构建动态 SQL,而不混淆嵌套条件?

    总的来说 我对 php 和编码相当陌生 我有一系列条件需要测试它们是否已设置 它们是 option1 option2 option3 if isset option1 if isset option2 if isset option3 qu
  • SQL 分隔符上的逗号分隔列

    这是一个 split 函数 它可以应用为dbo Split sf we fs we 当我将字符串更改为列名时 它不起作用 例如dbo Split table columnName Select from dbo Split email pr
  • 如何授予 SQL Server 代理访问权限以便能够写入/修改系统文件?

    我的工作有一个存储过程 运行 BCP 来查询一些数据 如果我单独运行 QUERYOUT 命令 它就会起作用 但是 如果我尝试在作业中运行它 它会创建文件但 挂起 并且数据永远不会放入文件中 这会永远挂起 所以我通常终止 BCP exe 我的
  • 使用 psycopg2 转义 Postgres 的 SQL“LIKE”值

    psycopg2 是否有转义 a 值的函数LIKEPostgres 的操作数 例如 我可能想匹配以字符串 20 of all 开头的字符串 所以我想写这样的内容 sql WHERE LIKE myvalue s cursor fetchal
  • 如何为“%abc%”搜索创建文本索引?

    我想对查询进行索引x like abc 如果我有一个如下表 create table t data varchar 100 我想创建一个索引以便能够有效地执行以下操作 select from t where contains abc 和这个
  • 什么是动态 SQL 查询?何时需要使用动态 SQL 查询?

    什么是动态 SQL 查询 何时需要使用动态 SQL 查询 我正在使用 SQL Server 2005 这里有几篇文章 动态SQL简介 http www sqlteam com article introduction to dynamic
  • 单个查询删除并显示重复记录

    采访中提出的问题之一是 一张表有100条记录 其中 50 个 是重复的 是否可以用单个 查询删除重复记录 从表中以及选择和 显示剩余 50 条记录 这可以在单个 SQL 查询中实现吗 Thanks SNA 对于 SQL Server 你会使
  • MySQL Tinybit(1) 通过视图的列

    我有一个连接 2 个表的视图 其中一个表具有表示布尔值的tinyint 1 类型的列 该表在连接时并不总是有条目 因此当行丢失时视图需要采用 0 false 值 我希望视图公开 TINYINT 1 类型且 NOT NULL 类型的列 因为它
  • 授予用户 ALTER 函数的权限

    我试着ALTER一个新用户的函数 我收到错误 ERROR must be owner of function ACases Error ERROR must be owner of function ACases SQL state 425
  • MySQL通过UPDATE/DELETE合并重复数据记录

    我有一个看起来像这样的表 mysql gt SELECT FROM Colors ID USERNAME RED GREEN YELLOW BLUE ORANGE PURPLE 1 joe 1 null 1 null null null 2
  • 使用显式创建表语句与 select into 创建表

    使用显式创建表语句和加载数据与选择数据之间是否存在性能差异 此示例仅显示 2 列 但问题是针对使用非常大的表 下面的示例也使用临时表 尽管我也想知道使用常规表的效果 我认为无论表格类型如何 它们都是相同的 临时表场景 Explicitly
  • 火鸟删除速度很慢

    我正在做这个简单的交易 DELETE FROM ominve01 WHERE CVE OBS IN SELECT CVE OBS FROM minve01 M WHERE M FECHA DOCU lt 31 12 2010 OR FECH

随机推荐

  • 如何从 jQuery 函数获取有用的堆栈跟踪?

    假设我有一个名为 myfile js 的文件 在 myfile js 内部我有以下代码 document on my custom event function e my custom function e alert undefined
  • 多个用户控件共享集合依赖属性

    我已经实现了自己的基于列表框的用户控件 它具有集合类型的依赖属性 当我在窗口中只有一个用户控件实例时 它工作得很好 但如果我有多个实例 我会遇到它们共享集合依赖属性的问题 下面是一个示例来说明这一点 我的用户控件称为 SimpleList
  • 从 std::string 对象到 char* 的显式转换,而不使用任何 std::string 成员函数

    这道题并不是什么问题 更多的是一个深入理解内存布局的问题std string 我做了一些实验并意识到可以显式转换std string to char 并成功检索存储在 a 中的 字符串 std string目的 问题是 当一个起始地址std
  • 当用户拖动鼠标时监听 JFrame 调整大小事件?

    当用户单击 JFrame 的一角来调整大小并拖动鼠标时 JFrame 将根据用户拖动时鼠标的当前位置重新绘制 您如何收听这些事件 以下是我目前尝试过的 public final class TestFrame extends JFrame
  • 使用 jQuery 提取 XML 中的 CDATA 以用作 HTML 内容

    我正在检索 Google Earth kml xml 文件并使用该内容在 Google 地图中放置标记 我感兴趣的特定 XML 标签如下所示
  • 量角器测试未在 Firefox 上启动

    我有一组在 chrome 上运行良好的测试 但是当我将功能 browserName 从 chrome 更改为 firefox 时 甚至没有收到错误信息 Before capabilities browserName chrome chrom
  • 位置服务 onProviderEnabled 从未被调用

    我有一项可以在我的应用程序中更新位置的服务 当我在禁用 GPS 的情况下启动应用程序 返回 Android 菜单并启用 GPS 最后返回我的应用程序 服务尚未被销毁 时 永远不会调用 onProviderEnabled 有人可以帮忙吗 UP
  • 空列表布尔值

    这可能很愚蠢 但对我来说有点令人困惑 In 697 l In 698 bool l Out 698 False In 699 l True Out 699 False In 700 l False Out 700 False In 701
  • 为什么 CORS 默认禁用?

    好吧 首先 我绝对知道我们对此有很多答案 并且有大量关于该主题的文章 在输入以下内容之前 我刚刚阅读了这些答案 为什么没有凭据的 CORS 被禁止 https stackoverflow com questions 26306080 why
  • Zurb Foundation 5 - 行填充/边距

    我正在尝试为我的行创建背景颜色 但是当我设置背景颜色时 它会扩展到列的常规宽度 然后我尝试使用填充来缩小行 这有效 但使列更小 我需要以某种方式删除粉红色区域 仅保留红色背景 并保持列均匀 有任何想法吗 div class row styl
  • Apache Bench 和 POST 数据

    我正在尝试使用 apache bench 在我的 Rails 应用程序中加载测试创建操作 但 ab 似乎没有发送 POST 数据 尽管它确实正确提交了 POST 而不是 GET 请求 这是我运行的命令 ab n 1 p post v 4 h
  • 如何通过 Meteor.call() 访问服务器端变量?

    我认为在 Meteor 中定义服务器端类来存储有关系统的信息是明智的做法 该信息应由选定的用户访问 它不存储在 MongoDB 中 所以据我了解 订阅和发布不是一个选项 这是我的简化方法 if Meteor isServer serverV
  • 如何检查Paramiko是否成功将文件上传到SFTP服务器?

    我使用 Paramiko 将文件放入 SFTP 服务器 import paramiko transport paramiko Transport host port transport connect username username p
  • 禁用 HTML 中的 GIF 动画

    在 HTML 中 有没有办法在 标签中包含动画 GIF 但自动告诉 GIF 不要动画 我意识到用户可以通过按 ESC 或单击 停止 来停止动画 但我希望 GIF 根本不动画 我只想在一个特定页面上执行此操作 并且制作 1500 GIF 的单
  • Xcode 4.3.3 iPhone 5.1 模拟器经常挂起

    我最近一直在四处寻找是否有人遇到类似的问题 但找不到太多信息 大多数时候在模拟器中启动应用程序效果很好 但是模拟器每天都会挂起一两次 我必须强制退出它 XCode 说 在模拟器上运行 xyz 当您尝试在 XCode 中 停止 时 什么也不会
  • ng-bootstrap crash:如何应用动画?

    我正在使用折叠 https ng bootstrap github io components collapse https ng bootstrap github io components collapse 然而 它并没有动画 即使不在
  • Laravel sql server 更改架构的表名称

    我正在开发一个项目 我试图在 SQL Server 数据库上设置一些具有架构的表 因此我手动将表名称更改为迁移文件上的 schema name table name 并且它起作用了 所以这里是例子 Schema create elector
  • 如何在 Django Rest Framework 中过滤具有权限的用户相关记录

    我需要知道如何限制对经过身份验证的用户的访问 以便可以为以管理员身份登录的用户完整列出用户记录 而对于以用户身份登录的用户 只能列出 更新和创建他们的记录 目前我正在使用serializers ModelSerializer viewset
  • Knockout.js 嵌套可排序绑定

    我正在使用 knockout js 可排序插件 然而 我遇到了一个至今无法解决的问题 我有两个可排序的绑定 一个用于存储桶 另一个用于存储桶项目 我能够在存储桶之间重新排序存储桶项目 但是 我无法重新排序存储桶 你知道为什么会这样吗 我也使
  • Postgres 中动态基数的累积添加

    我在 Postgres 中有以下场景 我正在使用9 4 1 我有一个这种格式的表 create table test id serial val numeric not null created timestamp not null def