PostgreSQL 使用“lag()”窗口函数更新查询

2024-07-04

我有一个涉及Postgresql数据库的任务。我对 SQL 不太有经验。

我有一张贸易产品每周营业额的表格。

每周提供以下信息:产品、周数、周营业额(可能是正值或负值,具体取决于天气,更多产品被购买或出售)。我添加了一栏,其中包含每周的期末余额。我的表中有第一周所有产品的期末余额 (week_number = 0),但所有其他周的余额均为“空”。下面提供了一些示例性记录。

    product                     | week_number | turnover | closing_balace
--------------------------------+-------------+----------+----------------
 BLGWK-05.00*1250*KR-S235JRN0-A |           0 |    50.00 |    1240.00
 BLGWK-05.00*1250*KR-S355J2CN-K |           0 |    45.70 |     455.75
 BLGWK-05.00*1464*KR-DD11NIET-K |           0 |    30.01 |     300.00
 BLGWK-05.00*1500*KR-DD11NIET-R |           1 |    10.22 |
 BLGWK-05.00*1500*KR-S235J2CU-K |           1 |    88.00 |

我需要一个查询来通过以下计算填充所有“空”的 opening_balance:

closing_balance = closing_balance of the same product for previous week + turnover for the week.

我尝试了这个查询:

update table_turnover 
set closing_balance = (select lag(closing_balance, 1) over (partition by product order by week_number) + turnover) 
where week_number > 0;

它从未起作用 - “第 0 周”以上的 close_balance 的“null”值仍然为“null”。

我也尝试过:

update table_turnover 
set closing_balance = (select 
                           case when week_number = 0 
                                   then closing_balance
                                   else (lag(closing_balance, 1) over (partition by product order by week_number) + turnover)
                           end
                       from table_turnover)

这会产生一个错误

子查询返回多条记录用作表达式

知道如何进行此计算吗?

先感谢您。


在中使用子查询from clause:

update table_turnover 
    set closing_balance = (ttprev.prev_closing_balance + ttprev.turnover) 
    from (select tt.*,
                 lag(closing_balance) over (partition by product order by 
week_number) as prev_closing_balance
          from table_turnover tt
         ) ttprev
    where ttprev.product = tt.product and ttprev.week_number = tt.week_number and
          week_number > 0;

或者,如果您想在select:

update table_turnover 
    set closing_balance = (turnover +
                           (select tt2.closing_balance 
                            from table_turnover tt2
                            where tt2.product = tt.product and tt2.week_number = tt.week_number - 1
                           )
                          )
    where week_number > 0;

为了性能(在任一版本上),您需要一个索引table_turnover(product, week_number, closing_balance).

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

PostgreSQL 使用“lag()”窗口函数更新查询 的相关文章

随机推荐

  • 如何设置 UWP 应用的默认语言?

    我有2种语言 en US 和 ru Ru 当我将默认语言设置为 ru RU 时 出现错误 PRI257 0xdef00522 找到语言 ru ru en us 的资源 但未找到默认语言的资源 ru RU 改变 默认语言或使用默认语言限定资源
  • 如何在 .proto 文件中处理带有协议缓冲区的通用类型对象?

    我花了一些时间寻找一些替代方法来处理通用对象 我看到了与我类似的问题 但没有我想象的那么具体 协议缓冲区有多种我可以使用的标量类型 但它们大多是原始的 我希望我的消息是灵活的 并且能够有一个作为某种列表的字段 假设我的 proto 文件如下
  • XAML 页面中的 Bindable 值存在问题

    我有一个保龄球回顾示例代码 其中输入了 3 场比赛并总结在系列列中 我遇到的问题是系列列没有按照我的预期进行更新 显然 我做错了什么 但看不到我做错了什么 以下是支持该应用程序的代码
  • 如何覆盖 nltk 的 pos_tag 分配给文本的 POS 标签?

    我使用 nltk 中的 pos tag 来标记一组 未标记的 技术文档中的文本并获得良好的结果 但它总是将 authenticated 等单词标记为动词 而有时它可以用作形容词 换句话说 仅仅改变标签并不是每次都有效 是否有一个好方法来覆盖
  • 嵌入式阵列文档中的 Morphia Mongodb 更新失败

    我是 Morphia 的新手 正在尝试更新嵌入式文档中的字段 这是当前的结构 class A List b BList class B String field 所以我的结构在 MongoDb 中如下所示 id ObjectId 5bab8
  • Python:多 QQ 绘图

    我是新人 通常来自 R 我想创建一个包含多行的 QQ Plot 我有一个测试版分布式数据集 我想尝试不同的 beta 分布参数并在oneQQ Plot 以便更好地进行比较 如果我尝试下面的代码 每个图都有相同的颜色 并且我得到 3 条 QQ
  • 我可以通过 Reflection 获取私有财产的价值吗?

    它似乎不起作用 ref new ReflectionObject obj if ref gt hasProperty privateProperty print r ref gt getProperty privateProperty 它进
  • Gulp Uglify 选项不适用

    您好 我正在为我工 作的公司制作一个主题 JS 部分无法在 uglify 中正确构建 我正在尝试使用 uglify 来简单地连接我的文件 这可以工作 但它们输出缩小和损坏 没有注释 我不明白为什么 下面是我的 gulp 任务 它运行正确 但
  • 如何在 ADF Oracle 11gR1 中的对话框窗口中的弹出窗口中刷新表

    我正在研究显示一个带有搜索表的弹出窗口的要求 当用户单击弹出窗口中的搜索按钮 提供输入文本框 时 需要使用新的数据集刷新搜索表 我创建了一个populateSearchTable 通过填充数组中的值来生成表的方法deviceListArra
  • MVC3 – ViewModel 和控制器功能:建议的设计模式

    我为一个不太可用的呼叫中心应用程序构建了一个简单的基于 MVC3 的票务输入站点 并尝试重构我的原型以更好地遵循设计模式 部分原因是为了使其更易于维护 但主要是作为一种学习练习 面向用户的视图是一种由基本用户信息以及允许选择各种资源类型的面
  • 将分层(树状)XML 读入 pandas 数据帧,保留层次结构

    我有一个 XML 文档 其中包含分层的树状结构 请参阅下面的示例 该文档包含几个
  • 尝试访问 USB 设备时出现 RPC_E_CANTCALLOUT_ININPUTSYNCCALL

    我有这段代码 var searcher new ManagementObjectSearcher root CIMV2 SELECT FROM Win32 DiskDrive foreach var queryObj in searcher
  • 如何防止使用外部客户端提供的任意 JSONB 查询字符串进行 SQL 注入?

    我有一个由 PostgreSQL 数据库支持的基本 REST 服务 其中有一个包含各种列的表 其中之一是包含任意数据的 JSONB 列 客户端可以将数据填充存储在固定列中 并提供任何 JSON 作为存储在 JSONB 列中的不透明数据 我希
  • BeautifulSoup 3.1 解析器太容易崩溃

    我在使用 BeautifulSoup 解析一些不可靠的 HTML 时遇到了麻烦 事实证明 新版本中使用的 HTMLParser 的容忍度低于以前使用的 SGMLParser BeautifulSoup 有某种调试模式吗 我正在尝试找出如何阻
  • 截至 2013 年,IE8 的响应式设计范围是否值得考虑?

    我仍然在这里看到与使响应式设计适用于 IE8 或 IE7 相关的问题 由于缺乏对 Windows 相关设备的了解 我的第一反应是 由于今天仍然运行 IE8 的移动设备数量微不足道 因此不值得为 IE8 实现响应式设计 对于这个特定的浏览器
  • 获取 PL/SQL 集合中元素的索引

    是否有内置函数可以确定 PL SQL 集合中元素的 第一个 索引 就像是 DECLARE TYPE t test IS TABLE OF VARCHAR2 1 v test t test BEGIN v test NEW t test A
  • 使用 SVG 的部分边框/描边

    我正在使用 svg d3 创建由 矩形 元素组成的图表 为每个矩形添加部分边框 描边 仅在矩形顶部 的最佳方法是什么 Thanks 我不认为 SVG 支持仅描边矩形或路径的一部分 描边不像 CSS 边框 您还有其他一些选择 所有这些都需要一
  • node.js 本机插件 - 包装类的析构函数不运行

    我正在用 C 编写一个 Node js 插件 我使用 node ObjectWrap 包装一些类实例 以将本机实例与 JavaScript 对象关联起来 我的问题是 包装实例的析构函数永远不会运行 这是一个例子 point cc inclu
  • Java JDK中有并发List吗?

    如何创建一个并发 List 实例 在其中可以按索引访问元素 JDK 有我可以使用的类或工厂方法吗 ConcurrentLinkedQueue 如果您不关心基于索引的访问 而只想要列表的插入顺序保留特性 那么您可以考虑java util co
  • PostgreSQL 使用“lag()”窗口函数更新查询

    我有一个涉及Postgresql数据库的任务 我对 SQL 不太有经验 我有一张贸易产品每周营业额的表格 每周提供以下信息 产品 周数 周营业额 可能是正值或负值 具体取决于天气 更多产品被购买或出售 我添加了一栏 其中包含每周的期末余额