问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用index函数把数据库中给定一个时间段内符合给出的一些条件的所有行数据提取到另一个工作表中?

发布网友 发布时间:2022-04-09 04:33

我来回答

3个回答

懂视网 时间:2022-04-09 08:54

在项目中,经常要看到这么一个要求:从一组根据时间排列的数据,要求计算出其中满足某个条件的一串数据,求这串数据的开始与结束时间.

比如说,用小米手环采集到一组用户的心率数据,要求算出其中有多长时间用户的心率>100.

比如说,通过Gps定位获取到车辆的行驶数据,按要求速度超过80就算超速,那么在这组数据中,车辆超速了多长时间.

在数据采集非常方便的时代,像以上的场景及需求比比皆是.

要算出所要求的结果,当然可以写个计算器,一条一条分析过去,但是这样的话效率非常慢.

更多时候还是要求在数据库中直接通过SQL算出结果。

因此我觉得这个算法非常有价值。

 假设具体场景

具体一点,比如下面这串数据:

技术分享

按照下面的条件将以上数据进行分段切割,

Speed >= 0 且 Speed < 30

Speed >= 30 且 Speed < 60

Speed >= 60 且 Speed < 80

Speed >= 80

并且算出每段数据的开始时间与结束时间,开始SOC与结束SOC.

 

思路

 1.先取到原始数据

;WITH temp AS (
	SELECT ROW_NUMBER() OVER (ORDER BY Car,Time ASC)AS ID, Time,Car,SOC
		,SpeedFlg = CASE WHEN Speed >= 0 AND Speed < 30 THEN 1
						 WHEN Speed >= 30 AND Speed < 60 THEN 2
						 WHEN Speed >= 60 AND Speed < 80 THEN 3
						 WHEN Speed >= 80 THEN 4
						 END
	FROM OrigData 
	WHERE Car = ‘ABCDEFK10NZ000001‘
	AND Time >= ‘2016-06-01‘
	AND Time <= GETDATE()
)

先把上面的整串数据取到.

 2.对数据进行排序,算出每个分段的开始于结束时间,并过滤掉分段中部的数据,保留分段的开始结束数据

final as(
	SELECT ROW_NUMBER()OVER(ORDER BY a.Car ) as tid,*
	FROM (
		SELECT a.Car,a.SpeedFlg,A.SOC
			,begintime = CASE WHEN A.ID = 1 OR b.SpeedFlg IS NULL THEN A.Time END
			,endtime = CASE WHEN c.SpeedFlg IS NULL THEN A.Time END
		FROM temp a
		LEFT JOIN temp b ON a.ID = b.ID +1 AND B.SpeedFlg = A.SpeedFlg
		LEFT JOIN temp c ON a.ID = c.ID - 1 AND C.SpeedFlg = A.SpeedFlg
	)A
	where begintime is not null
	or endtime is not null	
) 

根据上面的算法,可以得出以下数据

技术分享

3.将每个分段的开始结束数据进行合并,得到一个完整的数据

select a.Car
	,SpeedFlg = case a.SpeedFlg when 1 then ‘0-30‘
								when 2 then ‘30-60‘
								when 3 then ‘60-80‘
								when 4 then ‘80以上‘
								end
	,a.begintime,b.endtime,a.SOC as beginsoc ,b.SOC as endsoc
from final a
INNER JOIN final b on a.Car = b.Car and a.SpeedFlg = b.SpeedFlg and a.tid = b.tid - 1

最终得到下面这串数据

技术分享

点开可查看完整代码:

;WITH temp AS (
	SELECT ROW_NUMBER() OVER (ORDER BY Car,Time ASC)AS ID, Time,Car,SOC
		,SpeedFlg = CASE WHEN Speed >= 0 AND Speed < 30 THEN 1
						 WHEN Speed >= 30 AND Speed < 60 THEN 2
						 WHEN Speed >= 60 AND Speed < 80 THEN 3
						 WHEN Speed >= 80 THEN 4
						 END
	FROM OrigData 
	WHERE Car = ‘ABCDEFK10NZ000001‘
	AND Time >= ‘2016-06-01‘
	AND Time <= GETDATE()
),
final as(
	SELECT ROW_NUMBER()OVER(ORDER BY a.Car ) as tid,*
	FROM (
		SELECT a.Car,a.SpeedFlg,A.SOC
			,begintime = CASE WHEN A.ID = 1 OR b.SpeedFlg IS NULL THEN A.Time END
			,endtime = CASE WHEN c.SpeedFlg IS NULL THEN A.Time END
		FROM temp a
		LEFT JOIN temp b ON a.ID = b.ID +1 AND B.SpeedFlg = A.SpeedFlg
		LEFT JOIN temp c ON a.ID = c.ID - 1 AND C.SpeedFlg = A.SpeedFlg
	)A
	where begintime is not null
	or endtime is not null	
) 

select a.Car
	,SpeedFlg = case a.SpeedFlg when 1 then ‘0-30‘
								when 2 then ‘30-60‘
								when 3 then ‘60-80‘
								when 4 then ‘80以上‘
								end
	,a.begintime,b.endtime,a.SOC as beginsoc ,b.SOC as endsoc
from final a
INNER JOIN final b on a.Car = b.Car and a.SpeedFlg = b.SpeedFlg and a.tid = b.tid - 1

  

 

【数据库】【算法】从一串数据中获取符合某个条件的时间区间

标签:

热心网友 时间:2022-04-09 06:02

你这个数据,这么多条件, 如果用公式写也不是不可以但是需要数组公式,会非常麻烦。数组公式运算量也会很大,所以会导致运算非常缓慢。
建议用VBA来解决,可以实现你的问题,VBA运算也比较快,统计更准确。
当然,写VBA代码需要你的原表样表。如果让我写不免费。有必要的话可私信。 以下可以说一下思路。
如果用公式,要计算每一列的数据是否符合条件,如果符合所有组合条件,则返回行号,如果不符合所有条件,则返回工作表最大行号。然后用small或者large+row函数将对应符合条件的行号根据序列提取出来,然后再用index或者indirect函数返回相应的数据。由于你要查询的数据量比较大,每个单元格都要把数组中的数据运算一遍,再提取相应的数据,所以运算量非常大。可能会卡的受不了。
用VBA的思路,核对每一行数据,如果符合条件的,写入数组或者字典,然后将数组或者字典中的数据输出即可。所以每一行的数据只用提取一遍,而且内存运算, 速度非常快。 当然,如果不习惯这个, 也可以用复制粘贴的方法, 符合条件的直接粘贴过来也行。这样数据量大的话,可能会慢一些,但是可以带格式,代码相对好写一些,比较直观。
不管用哪种方式,做现在你这个要求的工作,都是代码比较合适。
如果还有问题,欢迎继续追问或者私信。

热心网友 时间:2022-04-09 07:20

把问题作为内容(邮件主题一定要包含“excel”,本人以此为依据辨别非垃圾邮件,以免误删),excel样表文件(尽量详细说明现状和目标效果)作为附件发到1流3油箱:yqch134帮你看下
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
稳定常数分布稳定常数 判断题: 配合物的稳定常数K为一不变的常数,它于溶液的酸度大小无关 和平精英电脑版手机安装教程如何下载和平精英电脑版 电脑怎么下和平精英电脑上如何下载和平精英 我的惠普DV2500前几天摄像头还可以用现在怎么用不了具体怎么解决啊_百 ... 惠普dv2500笔记本无法装XP系统,在dos下格式化C盘,其他盘找不到了... 成都火车东站到新都钟楼客运站(西南石油大学)怎么走? 成都高笋塘到成都市致民路怎么坐车 简述组建创业团队的原则 常见的创业团队模式有哪些 开公司组建队伍注意事项 请问在Running Man E124期中一小时二十五分是钟国掩护韩孝珠逃跑时响起的背景音乐是什么? 谁的青春不迷茫女主领奖逃跑时的背景音乐是什么? 为什么蚊子接近我们的时候会有“嗡嗡”的声音,逃跑时却不发出声音? 一步之遥马走日带着武六开车逃跑时的背景音乐是什么?电影结束时滚动字幕的时候也是这个音乐。 张家辉《激战》开始的时候,赤脚逃跑时的背景音乐? 急!炮弹坠落的音效 找背景音乐,在逃跑时候的~~ csgo僵尸逃跑音效怎么放出去 主播真会玩里主播经常作死逃跑时放的bgm很欢快的童声一直啦啦啦啦啦啦 中国探险家的故事(真实的)两百字 与珠穆朗玛峰争世界第一的是哪座山脉? 业余登山爱好者第一次登雪山可以选哪里? 慕士塔格峰需要中国登山协会的批准吗 早在14年就听闻夏伯渝攀登珠峰的消息了,至今已经两年有余了,他没有成功吗? 登山爱好者攀登珠穆朗玛峰,需要做好哪些方面的准备呢? 谁第一个在北坡攀上珠穆朗玛峰峰顶 去慕士塔格峰要几天啊?? 世界第一高峰是珠穆朗玛峰,第二是哪个 中国谁是第一个登上珠穆朗玛峰的人 中国最早登上珠穆朗玛峰的人是谁 彩钢围墙怎么做啊?详细的 怎样晒萝卜菜干? 彩钢瓦围墙与门面房要多少米 彩钢板 围墙 哪个便宜 你好外卖晚上可以做兼职吗 谁有简单的皮筋魔术最好有图解? 橡皮筋编手链 复杂的编法 那种像花一样的是怎么弄的 这个橡皮筋手链怎么编!求图解 橡皮筋魔术图解 最简单的魔术有哪些 学魔术最简单的橡皮筋 一学 求魔术解密:橡皮筋两个本来分开的后套在一起了解不开。 跪求win8密钥 怎样卸载win10自带的应用的directx 谁告诉我八年级快乐暑假答案网址【南方出版社】 空间站的三位宇航员的名字是什么? 2021年新登天问空间站的三个宇航员分别叫什么? 宇航员从太空站回来后身体一般会发生哪些变化? 长期在太空空间站工作的宇航员身体会有什么变化? 太空站去世的宇航员不会被运回地球,这样做的原因是什么? 国际空间站4名宇航员返回地球,他们的身体状况如何?