MySql如何获取相邻数据

目录
  • 如何获取相邻数据
  • 同表相邻数据比对查询
    • 需求
    • SQL
    • 解析
    • 最终SQL

如何获取相邻数据

因为项目,所以找到了一些资料并且总结了下关于获取相邻数据的方式。

我只找到了以下的...

/*获取id值与5相减绝对值最近的数据,如果有绝对值相同的,相邻的数据优先输出*/
/*ABS(X)其实就是获取绝对值,然后的话order by 后面的1代表着根据select关键字
后的第一个字段进行排序。limit 后面的数字代表着你想查询数据的行数*/
SELECT ABS(cid-5),cname FROM company ORDER BY 1 LIMIT 3
/*获取指定id的上一条记录,我这里是以id=5为例的*/
select cid,cname from company order by cid>=5,cid desc limit 1
/*获取指定id的下一条记录,我这里是以id=5为例的*/
SELECT cid,cname from company order by cid<=5,cid asc limit 1

记录一下,以免以后遇到又不会

同表相邻数据比对查询

需求

我们将会比对相邻的数据,其中value是递增的,但也会存在清零的情况。我们的需求是计算当天的分钟递增量。

SQL

语句中需要解释一下参数

** ctc_etl.1_1_1907/sum.out_2021 :表名**** WHERE
item_timestamp > “2021-12-01 00:00:00”
AND item_timestamp < “2021-12-02 00:00:00” 是我自己加的筛选条件**
SELECT b.id,( b.item_value - a.item_value ) AS value,
	b.item_timestamp AS time
FROM
	(
	SELECT id,item_value,
		@num := @num + 1 AS row_number
	FROM
		( SELECT @num := 0 ) r,
			ctc_etl.`1_1_1907/sum.out_2021`
	WHERE
		item_timestamp > "2021-12-01 00:00:00"
		AND item_timestamp < "2021-12-02 00:00:00"
	ORDER BY
		id
	) a,
	(
	SELECT
		id,
		item_value,
		item_timestamp,
		@num2 := @num2 + 1 AS row_number
	FROM
		( SELECT @num2 := 0 ) r2,
			ctc_etl.`1_1_1907/sum.out_2021`
	WHERE
		item_timestamp > "2021-12-01 00:00:00"
		AND item_timestamp < "2021-12-02 00:00:00"
	ORDER BY
		id
	) b
WHERE
	a.row_number + 1 = b.row_number;

解析

目前计算的只是每秒的增加量,其次就是存在负数的情况,也就是清零了后一个数比前一个小就造成了负数

最终SQL

SELECT
	c.id,
	SUM( c.VALUE ) AS value,
	DATE_FORMAT( c.time, "%Y-%m-%d %H:%i:00" ) AS time
FROM
	(
	SELECT
		b.id,
		(b.item_value - a.item_value ) AS value,
		b.item_timestamp AS time
	FROM
		(
		SELECT
			id,
			item_value,
			@num := @num + 1 AS row_number
		FROM
			( SELECT @num := 0 ) r,
			ctc_etl.`1_1_1907/sum.out_2021`
		WHERE
			item_timestamp > "2021-12-01 00:00:00"
			AND item_timestamp < "2021-12-02 00:00:00"
		ORDER BY
			id
		) a,
		(
		SELECT
			id,
			item_value,
			item_timestamp,
			@num2 := @num2 + 1 AS row_number
		FROM
			( SELECT @num2 := 0 ) r2,
			ctc_etl.`1_1_1907/sum.out_2021`
		WHERE
			item_timestamp > "2021-12-01 00:00:00"
		AND item_timestamp < "2021-12-02 00:00:00" ORDER BY id ) b WHERE a.row_number + 1 = b.row_number ) c WHERE c.VALUE > 0
GROUP BY
	DATE_FORMAT(
	c.time,
	"%Y-%m-%d %H:%i:00")

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SQL实现相邻两行数据的加减乘除操作

    SQL实现表里数据按一定顺序排序后,按某几个字段分组后相邻两行数据实现加减乘除运算. 思路: 1:先把表数据分组排序后打上序号标签 2:根据需求把标签字段加/减一 上代码: select distinct a.phone,from_unixtime(cast(floor(a.ts/1000) as bigint),'yyyyMMdd HH:mm:ss'),cha from table a join ( select a.phone,a.ts,abs(a.ts-b.ts)/1000 cha fro

  • MySQL数据表分区策略及优缺点分析

    为什么需要分区? 当面对巨大的数据表的时候,至少有一件事情是确定的,表太大了以至于每次查询的时候我们没法做全表扫描.而这个时候也没法使用索引,或者说索引意义不大,更不用说索引的维护代价和空间占用非常高.如果是依赖索引,会导致大量的碎片和低聚集度的数据,这会导致查询的时候有上千次的随机 I/O 访问而导致宕机.这种情况下一般只会使用1-2个索引,而不会更多.这种情况下,有两个可行的选项:查询必须从数据表的指定的部分顺序查找或者是期望的部分数据及其索引与服务器的内存匹配. 需要再次重申:在存储空间过

  • Mysql 相邻两行记录某列的差值方法

    表结构: 数据: 需求: 按照company_id不同分组,然后分别求出相同company_id相邻记录touch_time的差值 SQL: select r1.company_id, r1.touch_time, r2.touch_time, r1.touch_time - r2.touch_time from (select (@rownum := @rownum + 1) as rownum, info.company_id, info.touch_time from sys_touch_

  • MySql如何获取相邻数据

    目录 如何获取相邻数据 同表相邻数据比对查询 需求 SQL 解析 最终SQL 如何获取相邻数据 因为项目,所以找到了一些资料并且总结了下关于获取相邻数据的方式. 我只找到了以下的... /*获取id值与5相减绝对值最近的数据,如果有绝对值相同的,相邻的数据优先输出*/ /*ABS(X)其实就是获取绝对值,然后的话order by 后面的1代表着根据select关键字 后的第一个字段进行排序.limit 后面的数字代表着你想查询数据的行数*/ SELECT ABS(cid-5),cname FRO

  • Mysql时间轴数据 获取同一天数据的前三条

    创建表数据 CREATE TABLE `praise_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', `pic_id` varchar(64) DEFAULT NULL COMMENT '图片ID', `created_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), KEY `pic_id` (`pic_id`) U

  • PHP实现获取MySQL数据库的记录数据

    目录 如果后台数据处理使用PHP来进行,那么就要有相应的数据处理及返回. 最常用的就是获取记录总数和表记录查询结果. 获取数据表的记录总数 <?php require 'linkConfig.php';//根据连接信息连接数据库 $sql = "select count(*) from druserlist where C04='普通用户'";//查询数据表 $result = $mysqli->query($sql);//以索引的方式返回一个结果集 list($rowCo

  • mysql如何通过当前排序字段获取相邻数据项

    目录 通过当前排序字段获取相邻数据项 1.业务场景 2.思路 3.sql 同表相邻数据查询或计算 用户下相邻订单的时间差举例 通过当前排序字段获取相邻数据项 1.业务场景 (1)需要专门以一个弹窗页面展示一项数据的所有字段值.其中一些字段值长度较大. (2)能够左右切换上一项下一项数据 (3)存在可排序的字段,如以id进行排序 2.思路 2.1 sql 1>查询前一项,查询小于当前id的项逆序取第一个 2>查询后一项,查询大于当前id的项正序取第一个 3>连接两项结果 2.2 页面逻辑

  • jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解

    本文使用jQuery,结合PHP和Mysql,通过实例讲解如何实现Ajax数据加载效果. HTML <div id="list"> <ul></ul> </div> <div id="pagecount"></div> 页面中,#list用来展示数据列表,包括本例要展示的商品图片和标题,#pagecount用来展示分页条,即本例中的上一页.下一页. 当然,别忘了,在head中预先载入jquery

  • 如何在Java程序中访问mysql数据库中的数据并进行简单的操作

    在上篇文章给大家介绍了Myeclipse连接mysql数据库的方法,通过本文给大家介绍如何在Java程序中访问mysql数据库中的数据并进行简单的操作,具体详情请看下文. 创建一个javaProject,并输入如下java代码: package link; import java.sql.*; /** * 使用JDBC连接数据库MySQL的过程 * DataBase:fuck, table:person: * 使用myeclipse对mysql数据库进行增删改查的基本操作. */ public

  • mysql 查询重复的数据的SQL优化方案

    在mysql中查询不区分大小写重复的数据,往往会用到子查询,并在子查询中使用upper函数来将条件转化为大写.如: 复制代码 代码如下: select * from staticcatalogue WHERE UPPER(Source) IN (SELECT UPPER(Source) FROM staticcatalogue GROUP BY UPPER(Source) having count(UPPER(Source))>1) ORDER BY upper(Source) DESC; 这条

  • 详解MySQL插入和查询数据的相关命令及语句使用

    插入数据 MySQL 表中使用 INSERT INTO SQL语句来插入数据. 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据. 语法 以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法: INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); 如果数据是字符型,必须使用单引号或者双引号,如:"value

  • beego获取ajax数据的实例

    1. 什么是AJAX Asynchronous JavaScript And XML(异步 JavaScript 及 XML),是指一种创建交互式网页应用的网页开发技术 Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 2. 如何使用 AJAX XMLHttpRequest 是 AJAX 的基础. XMLHttpRequest 用于在后台与服务器交换数据.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 使用AJAX大致分四步 1. 创建XMLHttpR

  • PHP+ajax实现获取新闻数据简单示例

    本文实例讲述了PHP+ajax实现获取新闻数据的方法.分享给大家供大家参考,具体如下: Get方式获取到的信息是字符串(responseText) ① 可以借助JSON对象的方法:stringify()和parse()方法,进行字符串和对象之间的转换 var arr=[1,2,3]; var a={left:100}; //alert(JSON.stringify(a));//typeof JSON.stringify(arr)是string //JSON对象的输出有严格格式:'{"left&q

随机推荐