热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

从仅在值更改时记录的表中推断每日历史值(PostgreSQL9.3)

如何解决《从仅在值更改时记录的表中推断每日历史值(PostgreSQL9.3)》经验,为你挑选了1个好方法。

我有一个表,每当位置的分数发生变化时,该表就会记录一行。

score_history:

id int PK(UUID自动递增int)

时间戳(发生变化时)

location_id int FK(值用于的位置)

分数浮动(新分数)

这样做是出于效率的考虑,并且能够简单地检索给定位置的更改列表并很好地实现了该目的。

我正在尝试以非常冗余的格式输出数据,以帮助将其加载到严格的外部系统中。外部系统希望每个位置*每个日期都有一行。目标是代表每个日期每个位置的最后得分值。因此,如果分数在给定日期中更改了3次,则只有最接近午夜的分数才被视为该位置当天的分数。我想这类似于创建关闭业务库存级别事实表的挑战。

我有一个方便的星形模式样式日期维表,其中每个日期都有一行,完全覆盖了此示例期间以及未来的日期。

那张桌子看起来像

dw_dim_date:

日期日期PK

一堆其他列,例如星期数,is_us_holiday等。

因此,如果我在score_history表中只有3条记录...

1, 2019-01-01:10:13:01, 100, 5.0
2, 2019-01-05:20:00:01, 100, 5.8
3, 2019-01-05:23:01:22, 100, 6.2

所需的输出将是:

2019-01-01, 100, 5.0 
2019-01-02, 100, 5.0 
2019-01-03, 100, 5.0
2019-01-04, 100, 5.0 
2019-01-05, 100, 6.2

3要求:

    即使该天没有分数记录,每个位置每天也要排一行。

    如果当天有分数记录,则午夜之前的最后一个应该是该行的分数值。如果出现平局,则两者中的较大者应“获胜”。

    如果当天的分数记录为零,则分数应为最近的先前分数。

我一直在通过子查询和窗口函数来追踪自己的尾巴。

因为我不愿意发布没有任何内容的东西,所以我将分享这个火车残骸,它会产生输出,但没有任何意义...

SELECT dw_dim_date.date,
       (SELECT score 
        FROM score_history 
        WHERE score_history.happened_at::DATE  '2019-06-01'

感谢您提供指导或其他问题的阅读指南。



1> Lukasz Szozd..:

您可以通过使用相关子查询和实现此目的LATERAL

SELECT sub.date, sub.location_id, score
FROM (SELECT * FROM dw_dim_date
      CROSS JOIN (SELECT DISTINCT location_id FROM score_history) s
      WHERE date >= '2019-01-01'::date) sub
,LATERAL(SELECT score FROM score_history sc 
         WHERE sc.happened_at::date <= sub.date
           AND sc.location_id = sub.location_id
         ORDER BY happened_at DESC LIMIT 1) l
,LATERAL(SELECT MIN(happened_at::date) m1, MAX(happened_at::date) m2 
         FROM score_history sc
         WHERE sc.location_id = sub.location_id) lm
WHERE sub.date BETWEEN lm.m1 AND lm.m2
ORDER BY location_id, date;

db <> fiddle演示

怎么运行的:

1)s(这是每个location_id的所有日期的交叉联接)

2)l(按位置选择分数)

3)lm(选择每个位置的最小/最大日期进行过滤)

4)WHERE在可用范围内过滤日期,如有需要可以放宽日期


谢谢您,这是LATERAL的非常有趣的介绍,并且在数据集较大的情况下也表现出色。
推荐阅读
  • 本文介绍了如何通过安装 sqlacodegen 和 pymysql 来根据现有的 MySQL 数据库自动生成 ORM 的模型文件(model.py)。此方法适用于需要快速搭建项目模型层的情况。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • CRZ.im:一款极简的网址缩短服务及其安装指南
    本文介绍了一款名为CRZ.im的极简网址缩短服务,该服务采用PHP和SQLite开发,体积小巧,约10KB。本文还提供了详细的安装步骤,包括环境配置、域名解析及Nginx伪静态设置。 ... [详细]
  • 探讨了SQL Server 2000自带工具绘制的一对多关系表的效果及其导出功能,并推荐了几款专业的ER图绘制软件。 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 解决JavaScript中法语字符排序问题
    在开发一个使用JavaScript、HTML和CSS的Web应用时,遇到从SQLite数据库中提取的法语词汇排序不正确的问题,特别是带重音符号的字母未按预期排序。 ... [详细]
  • 本文详细介绍了PostgreSQL与MySQL在SQL语法上的主要区别,包括如何使用COALESCE替代IFNULL、金额格式化的方法、别名处理以及日期处理等关键点。 ... [详细]
  • 本文详细介绍了在 Ubuntu 16.04 系统上安装和配置 PostgreSQL 数据库的方法,包括如何设置监听地址、启用密码加密、更改默认用户密码以及调整客户端访问控制。 ... [详细]
  • 本文作为《WM平台上使用Sybase Anywhere 11》系列的第二篇,将继续探讨在Windows Mobile (WM) 系统中如何高效地操作Sybase Anywhere 11数据库。继上一篇关于安装与基本测试的文章之后,本篇将深入讲解数据库的具体操作方法。 ... [详细]
  • 本文探讨了在SQL Server中处理几何类型列时遇到的INTERSECT操作限制,并提供了解决方案,包括通过转换数据类型和使用额外表结构的方法。 ... [详细]
  • 从CodeIgniter中提取图像处理组件
    本指南旨在帮助开发者在未使用CodeIgniter框架的情况下,如何独立使用其强大的图像处理功能,包括图像尺寸调整、创建缩略图、裁剪、旋转及添加水印等。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文记录了在Windows 8.1系统环境下,使用IIS 8.5和Visual Studio 2013部署Orchard 1.7.2过程中遇到的问题及解决方案,包括503服务不可用错误和web.config配置错误。 ... [详细]
author-avatar
海边遗忘的时光_958
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有