当前位置: 首页 > article >正文

PostgreSQL中查询每个账号的最新和最新前的数据

问题背景

有时候我们需要PostgreSQL中查询每个账号的最新和最新前的数据,也就是Rank1+2的数据供使用。

解决方案

如果PostgreSQL中查询每个账号的最新和最新前的数据,我们可以使用窗口函数来实现。窗口函数允许我们对数据进行分区,然后在每个分区内执行计算。这里,我们可以使用ROW_NUMBER()窗口函数来为每个账号的记录分配一个唯一的行号,其中最新的记录将被分配行号1,最新前的数据将被分配行号2。

以下是一个SQL查询示例,它将返回每个账号的最新和最新前的数据:

SELECT *
FROM (
    SELECT
        account_id,
        transaction_date,
        amount,
        ROW_NUMBER() OVER (PARTITION BY account_id ORDER BY transaction_date DESC) AS rn
    FROM account_transactions
) AS subquery
WHERE rn <= 2;

这个查询的工作原理如下:

  1. PARTITION BY account_id告诉ROW_NUMBER()函数将数据按照account_id进行分区。
  2. ORDER BY transaction_date DESC确保在每个分区内,记录是按照transaction_date降序排序的,这样最新的记录将排在前面。
  3. ROW_NUMBER()为每个分区内的每一行分配一个唯一的行号,最新的记录将被分配行号1。
  4. 外层查询通过WHERE rn <= 2条件过滤出行号为1和2的记录,即每个账号的最新和最新前的数据。

请注意,这个查询假设account_transactions表中有一个account_id列(账号ID)、transaction_date列(交易日期)和amount列(金额)。如果你的表结构不同,你需要根据实际情况调整上述查询。

此外,如果你需要标记每条记录是最新记录还是最新前的数据,你可以使用CASE语句来添加一个额外的列来表示这个信息,如下所示:

--by https://zhengkai.blog.csdn.net
SELECT
    account_id,
    transaction_date,
    amount,
    CASE WHEN rn = 1 THEN 'Latest'
         WHEN rn = 2 THEN 'Second Latest'
    END AS record_type
FROM (
    SELECT
        account_id,
        transaction_date,
        amount,
        ROW_NUMBER() OVER (PARTITION BY account_id ORDER BY transaction_date DESC) AS rn
    FROM account_transactions
) AS subquery
WHERE rn <= 2;

这个查询将返回每个账号的最新和最新前的数据,并在record_type列中标记每条记录是最新记录还是最新前的数据。


http://www.kler.cn/news/365866.html

相关文章:

  • 使用python代码绘制好看的统计图
  • 纯血鸿蒙的最难时刻才开始
  • 微信小程序中关闭默认的 `navigationBar`,并使用自定义的 `nav-bar` 组件
  • 合并数组的两种常用方法比较
  • WPF的UpdateSourceTrigger属性
  • 【揭秘】图像算法工程师岗位如何进入?
  • elementUI 时间控件控制时间选择
  • 扫雷游戏(C语言详解)
  • uni.showLoading 时禁止点击(防止表单重复提交) 小程序调取微信支付
  • 【NPM】工程化依赖包/库开发 之 常见开发结构/模式及特点
  • 目前最新 Reflector V11.1.0.2067版本 .NET 反编译软件
  • R5:天气预测-探索式数据分析
  • Java中的设计模式:单例模式详解
  • VScode插件:前端每日一题
  • List线性表
  • 单片机_RTOS__架构概念
  • mongodb高可用副本集 docker版
  • linux下的进程等待(wait、waitpid)
  • Vue 3项目的性能监测和优化
  • 日常记录:es TransportClient添加证书处理
  • vscode 配置构建、调试QT项目
  • uniapp renderjs页面传值
  • 【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (七):MongoDB的设置
  • 虚拟化基础
  • java List<Map<String, Object>> 转 List<JSONObject> 的几种方式
  • Log4j和SLF4J在Java中打印日志的区别