Postgresql时间处理技巧,每半天,每周,每月和每5分钟统计

2023-11-01

一、每半天

如果有张表log_bus_runinfo里有一个created_date是timestamp类型,如何统计12点前的数据?

在 PostgreSQL 中,您可以使用 DATE_TRUNC 函数和 WHERE 子句来统计特定时间范围内的数据。以下是一个查询例子,用于统计 log_bus_runinfo 表中创建日期 created_date 早于当天中午 12 点的记录数:

SELECT COUNT(*) 
FROM log_bus_runinfo 
WHERE DATE_TRUNC('day', created_date) = current_date AND created_date < current_date + interval '12 hours'

上述查询会使用 DATE_TRUNC 函数将 created_date 字段截断为该天(时间部分被删除),之后使用 WHERE 子句选择操作当天(而不是整个历史)的记录,并且创建日期小于这一天中午 12 点(即 current_date + interval '12 hours')。

同样,如果处理后半天的SQL:

SELECT COUNT(*) 
FROM log_bus_runinfo 
WHERE DATE_TRUNC('day', created_date) = current_date 
AND created_date >= current_date + interval '12 hours'

二、每周

如果有张里程表count_mileage,字段count_mileage表示每天的里程数,如何统计上一周的公里数?

SELECT
        created_date::DATE-(extract(isodow from created_date::TIMESTAMP)-1||'day')::interval countWeek,
        sum(mileage_count) mileage
        from count_mileage
        GROUP BY created_date::DATE-(extract(isodow from created_date::TIMESTAMP)-1||'day')::"interval"
        order by countWeek
        limit 1

它用于从count_mileage表中检索日期创建和总路程,并根据学院id和每周计数对其进行分组。以下是逐行的语法分析:

  • select created_date::date-(extract(isodow from created_date::timestamp)-1||'day')::interval countweek,: 选择created_date列按照给定的方式格式化,从这个处减去星期中第一天前面的日期(例如,今天如果是星期四,则减去3天的时间),并将结果设置为名为countweek的新列。
  • sum(mileage_count) mileage: 计算mileage_count的总值,并将结果命名为mileage。
  • from count_mileage: 从count_mileage表中选择数据。
  • where 1=1: 这个条件没有实际效果,只是作为一个占位符。
  • group by created_date::date-(extract(isodow from created_date::timestamp)-1||'day')::"interval": 根据日期进行分组,与上面的created_date列的操作一样。
  • order by countweek: 按名称为countweek列的升序排序。
  • limit 1: 结果最多返回1周。

总之,这个sql查询检索了给定条件下每周的总里程数,并按日期和计数排序。

如果统计近8周的里程数?SQL是:

select
        created_date::DATE-(extract(isodow from created_date::TIMESTAMP)-1||'day')::interval countWeek,
        sum(mileage_count) mileage
        from count_mileage
        GROUP BY created_date::DATE-(extract(isodow from created_date::TIMESTAMP)-1||'day')::"interval"
        order by countWeek
        limit 8

三、每月

如果有张里程表count_mileage,字段count_mileage表示每天的里程数,如何统计每月的公里数?

SQL:

select distinct to_char(created_date,'yyyy-mm') countMonth ,sum(mileage_count) mileage
        from count_mileage
        where 1=1
        and to_char(created_date,'yyyymm')>to_char((select now() as timestamp)-'6 month'::"interval",'yyyymm')
        group by to_char(created_date,'yyyy-mm')
        order by countMonth

它从count_mileage表中检索日期创建和总里程,并根据每月计数进行分组。以下是逐行的语法分析:

  • select distinct to_char(created_date,'yyyy-mm') countmonth: 选择created_date列并将其格式化为年月格式。该distinct关键字用来去掉重复行,如果有多个日期值对应同一个年月,则只返回一个。
  • ,sum(mileage_count) mileage: 计算mileage_count的总值,并将结果命名为mileage。
  • from count_mileage: 从count_mileage表中选择数据。
  • where 1=1: 这个条件没有实际效果,只是作为一个占位符。
  • and to_char(created_date,'yyyymm')>to_char((select now() as timestamp)-'6 month'::"interval",'yyyymm'): 仅选择最近六个月内的行,在查询时将当前时间减去6个月的时间来获得区别日期,并按照同样的格式转换成字符串后和表中的字段比较,筛选出符合条件的记录。
  • group by to_char(created_date,'yyyy-mm'): 根据年月格式对数据进行分组。
  • order by countmonth: 按名称为countmonth列的升序排序。

因此,这个sql查询检索了过去6个月的每月总里程数,并按时间顺序排序。

四、每5分钟数据

如果有张表是GPS信息,log_bus_driver,其中有经度、纬度字段bus_longitute,bus_latitute,时间是created_date,想按照每5分钟进行分段取信息进行分析,如何做?

 SELECT distinct on (CAST (extract(epoch from date_trunc('second', created_date)) AS integer) / 300) created_date
            ts, CAST (extract(epoch from date_trunc('second', created_date)) AS integer) % 300 as sec,
            bus_longitude, bus_latitude
        from log_bus_drive
        where to_char( created_date, 'yyyyMMdd' ) = '20230428'
        order by CAST (extract(epoch from date_trunc('second', created_date)) AS integer) / 300 asc, created_date asc

这条SQL语句主要功能是从" log_bus_drive" 表中选出所有"created_date"为'20230428' 的记录,并且按照时间间隔5分钟(group by 300 seconds)聚合数据。这里需要对查询语句进行分解来更好地理解它的作用:

以下是每个元素的工作方式:

  • distinct on (CAST (extract(epoch from date_trunc('second', created_date)) AS integer) / 300):以5分钟为单位分组并选择每个分组的唯一结果。

  • created_date ts:该列表示原始的created_date字段值。

  • CAST(extract(epoch from date_trunc('second', created_date)) AS integer) % 300 as sec:此列显示created_date到该5分钟周期的秒数,range在0-299之间。

  • bus_longitude and bus_latitude:这些字段包含公交车的经度和纬度坐标。

  • log_bus_drive: 数据源表。

  • where to_char( created_date, 'yyyyMMdd' ) = '20230428': 筛选出符合条件的生成日期(created_date)。这里是2023年4月28日。

  • ORDER BY CAST (extract(epoch from date_trunc('second', created_date)) AS integer) / 300 asc, created_date asc;: 根据时间戳(秒整数)和创建日期进行升序排序。

五、近七日数据统计

如果有张表count_driver_warn,想统计近七日的警告数据,如何做?

select sum(warn_count) warnCount,driver_name driverName
        from count_driver_warn
        where created_date >=CURRENT_DATE- INTERVAL '7 day'
               and driver_name is not null
        group by driver_name
        order by warnCount desc

这个SQL语句的主要功能是从" count_driver_warn" 表中选出所有created_date在7天内的记录,并按照驾驶员名字分组计算每个驾驶员的警告次数数量和警告类型,然后按警告次数从高到低排序。这里需要对查询语句进行分解来更好地理解它的作用:

以下是每个元素的工作方式:

  • sum(warn_count) warnCount: 计算每个驾驶员的总警告次数。

  • driver_name driverName: 数据中包含的驾驶员姓名以及生成搜集日期。

  • count_driver_warn: 数据源表。

  • WHERE created_date >= CURRENT_DATE - INTERVAL '7 day' AND driver_name IS NOT NULL:筛选出创建日期在7天内且不为空的驾驶员记录。其中CURRENT_DATE 函数获取当前系统时间, INTERVAL '7 day' 是时间间隔,用来表示最近的7天(从当前日期往前)。

  • GROUP BY driver_name:将所有驾驶员的记录进行分组,聚合统计每个驾驶员的总警告次数。

  • ORDER BY warnCount DESC:根据警告次数排序,从高到低按最大警告数排序。

六,前几分钟的数据抓取          

SELECT <include refid="Base_Column_List" />
    FROM log_bus_runinfo
    WHERE bus_id = #{busId}
    <if test="beforeMinute !=null">
      and created_date>(now() + ('-'||#{beforeMinute}||' min')::interval)
    </if>
    order by created_date desc
    limit 1

其各部分含义如下:

  • select <include refid="base_column_list" />:选择出表 log_bus_runinfo 中所有字段。
  • from log_bus_runinfo:从表 log_bus_runinfo 中进行查询。
  • where bus_id = #{busid}:限制查询结果中 bus_id 等于传入参数 busid 的那些行。
  • <if test="beforeminute !=null">...</if>:判断是否需要筛选时间。如果传入参数 beforeminute 不为 null,则进行筛选;否则不进行筛选。
  • and created_date>(now() + ('-'||#{beforeminute}||' min')::interval):如果进行了时间筛选,则只选择 created_date 大于当前时间减去参数 beforeminute 所代表分钟数之后的那些记录。
  • order by created_date desc:按照 created_date 字段逆序排列(即最新的记录排在前面)。
  • limit 1:仅返回第一条记录作为查询结果。

总体来看,该 sql 语句是基于某个 bus_id 查找其最近的行驶记录,并且可以通过参数 beforeminute 控制所要查找的记录的时间范围。

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

Postgresql时间处理技巧,每半天,每周,每月和每5分钟统计 的相关文章

  • C#入门代码集25个

    一 从控制台读取东西代码片断 using System class TestReadConsole public static void Main Console Write Enter your name string strName C
  • 小程序的拉流组件live-player的使用

    前言 我们在小程序中实现音视频 直播 录播 的播放时候 会使用到微信官方提供的两个组件 推流组件和拉流组件 这里来分享下他的拉流组件的使用和具体需要注意的点 效果图 1 拉流状态code日志 2 代码使用截图 官方文档 live playe

随机推荐

  • 帮我写爬取考研资料的代码

    我可以提供一些参考代码帮助您爬取考研资料 加载必要的库 import requests from bs4 import BeautifulSoup 设置网址 url http example com exam data 获取网页源代码 re
  • vue动态添加路由,element-admin后台路由

    很多后台项目的菜单都是可配置的 所以需要从后台取到菜单数据并加到路由映射用 1 第一步 将后台数据转换成vue router 需要的数据格式 以下是路由格式 declare type RouteConfig path string 路径 c
  • c/c++编程日记:用C语言实现消消乐游戏(附源码)

    描述 给定一个矩阵 判断移动哪一个格子 可以实现消除 定义连续三个即可消除 分析 先写一个函数 判断包含 i j 的格子是否可能实现消除 然后就是向右向下交换 然后调用上面写好的函数判断 被交换的两个格子是否实现消除 重点 1 只需要向右向
  • 关于IDEA中Spring配置文件中的提示:File is included in 4 contexts

    关于IDEA中Spring配置文件中的提示 File is included in 4 contexts 今天在学习SpringMVC框架的时候 由于web xml中需要绑定Spring的配置文件 在配好Spring的配置文件并运行Tomc
  • DINO-DETR在COCO缩减数据集上实验结果分析

    问题篇 博主在进行DINO DETR模型实验时 使用缩减后的COCO数据集进行训练 发现其mAP值只能达到0 27作用 故而修改了下pycocotool的代码 令其输出每个类别的AP值 来看看是由于什么原因导致这个问题 之所以这样是因为博主
  • springboot-内置Tomcat

    一 springboot的特性之一 基于springboot的特性 自动装配 Configuretion 注解 二 springboot内置Tomcat步骤 直接看SpringApplication方法的代码块 总纲 1 在SpringAp
  • keil出现错误declaration is incompatible

    错误来源 ECAT inc STM32appl h 38 error 147 declaration is incompatible with unsigned shortnPdInputSize declared at line 396
  • java.io.FileNotFoundException: open failed: EROFS (Read-only file system)

    在聊天中发视屏的时候 需要获取视屏某一帧的图片 以文件形式上传给服务器 然后就出了这个错 在确定文件读取权限都有的情况下 那么很可能就是路径不对一看果然 String filePah System currentTimeMillis png
  • MySQL主从同步原理

    主从复制 是用来建立一个和主数据库完全一样的数据库环境 称为从数据库 主数据库一般是准实时的业务数据库 原理 数据库有个bin log二进制文件 记录了所有sql语句 我们的目标就是把主数据库的bin log文件的sql语句复制过来 让其在
  • ZOJ1610 线段树区间计数

    这题和之前的某道区间建立正好相反 给整懵了 题意 给定一个长为 8000 8000 8000的区间 每次染色一定长度的区间 最后问你每种颜色的区间有多少段 题解 注意必须建 8000 8000 8000的树 然后模拟下递归过程 蒟蒻只会这么
  • L2-034 口罩发放 (25 分)

    好恶心的一道题 就因为我把有症状的人用set存 结果一直卡在后三个样例 把我恶心吐了 最后实在没法把set改成vector顺便标记一下看看是否访问过一次 然后就过了 我tm改了接近两个小时 结果就卡在这 include
  • sed删除中文字符

    LANG C sed r s x81 xFE x40 xFE g test txt 转载于 https blog 51cto com dellinger 2409040
  • 宽带连接已断开

    宽带连接已断开 故障描述 原因分析 解决方案 1 排查线路接触不良 2 排查WI FI开关冲突 3 排查关闭节能以太网功能冲突 3 排除其他网卡冲突 4 排查ipv6协议 和 Ipv4协议冲突 方案一 取消勾选ipv6协议 方案二 重装或者
  • k8s学习-CKS真题-Dockerfile和deployment优化

    目录 题目 环境搭建 解题 Dockerfile deployment yaml 模拟题 参考 题目 Task 1 分析和编辑给定的 Dockerfile cks docker Dockerfile 基于 ubuntu 16 04 镜像 并
  • [转载] 深入理解log机制

    原文 http feihu me blog 2014 insight into log 诊断日志对于定位和修复问题起着至关重要的作用 曾经很傻很天真的认为输出日志就是仅仅调用printf 或者std cerr 而已 简单的不能在简单了 这种
  • “区块链+影视”将会在影视娱乐界刮起怎样的风?

    当一种技术能够渗透到各个产业 并在各个产业都产生巨大的价值的时候 它的潜力和未来价值就会被更多人所追捧 在过去的一年时间里 区块链这一划时代的技术夺目地进入公众视野 被认为是当前最有可能带来颠覆性改变的技术 进入2018年来 区块链行业已更
  • kettle 教程(一):简介及入门

    介绍 kettle 是纯 java 开发 开源的 ETL工具 用于数据库间的数据迁移 可以在 Linux windows unix 中运行 有图形界面 也有命令脚本还可以二次开发 kettle 的官网是 https community hi
  • HCIA笔记整理

    网络基础 什么是网络 网络就是由网络连接设备通过传输介质将网络终端设备连接起来 进行资源共享 信息传递的平台 交换机 交换机是按照通信两端传输信息的需要 用人工或设备自动完成的方法把要传输的信息送到符合要求的相应路由上的技术统称 交换机的作
  • element 表单动态获取性别

    element 动态获取性别 在前端页面里总是会有根据1和2显示相应的内容 我是小白刚接触这些就感觉无能为力 找了一些资料才有了解决方法 话不多说上代码
  • Postgresql时间处理技巧,每半天,每周,每月和每5分钟统计

    一 每半天 如果有张表log bus runinfo里有一个created date是timestamp类型 如何统计12点前的数据 在 PostgreSQL 中 您可以使用 DATE TRUNC 函数和 WHERE 子句来统计特定时间范围