oracle-sql如何查出:一段时间内(输入时间区间),某数据,连续7天内出现5天及以上?
要求oracle-sql,高手进,菜鸟还是别看,你想不出来的2.数据表是:id(唯一),标题,派单时间3.查出(高频率出现的标题)-算法:标题(可重复),连续7天内出现5...
要求oracle-sql,高手进,菜鸟还是别看,你想不出来的2.数据表是:id(唯一),标题,派单时间3.查出(高频率出现的标题)-算法:标题(可重复),连续7天内出现5天及以上,认定为高频率出现。4.查出符合条件的高频率数据
5.数据模板:
1 张三 2001-10-1 8:15:20
2 张三 2001-10-2 8:15:20
3 张三 2001-10-3 8:15:19
4 张三 2001-10-3 8:15:21
5 张三 2001-10-3 8:15:21
6 李四 2001-10-4 8:15:20
7 张三 2001-10-5 8:15:20
8 李四 2001-10-6 8:15:20
9 张三 2001-10-7 8:15:20
10 李四 2001-10-8 8:15:20
11 李四 2001-10-9 8:15:20
12 李四 2001-10-10 8:15:25
13 李四 2001-10-11 8:15:26
14 李四 2001-10-12 8:15:26 展开
5.数据模板:
1 张三 2001-10-1 8:15:20
2 张三 2001-10-2 8:15:20
3 张三 2001-10-3 8:15:19
4 张三 2001-10-3 8:15:21
5 张三 2001-10-3 8:15:21
6 李四 2001-10-4 8:15:20
7 张三 2001-10-5 8:15:20
8 李四 2001-10-6 8:15:20
9 张三 2001-10-7 8:15:20
10 李四 2001-10-8 8:15:20
11 李四 2001-10-9 8:15:20
12 李四 2001-10-10 8:15:25
13 李四 2001-10-11 8:15:26
14 李四 2001-10-12 8:15:26 展开
2个回答
展开全部
我的大概想法和思路(本人无环境,所有内容都是臆想出来的,没办法测试)
(1)分组,因为是只要连续7天内5天即可,每天的次数并不重要,所以按照(人名和日期(不是时间是日期也就是截取到日)分组),这样可以去掉每天重复的次数。
(2)分好组后的内容,按照人名和日期排序。这样也就是说所有张三的都在一起,李四的都在一起,而且每个人的都是按照日期排序的。(这步其实不做也可以,因为下面的lead函数本身也可以分组排序,不过这样说对你来说更直观一些)
(3)利用lead函数(就是查某行数据的下几行的函数,可能你没有用过,我用的次数也不多。)往下查4行。
这个就是出现了5次,因为:四行+本身=5次,只要证明这5次发生在7天内就可以了。
(4)所以最后一步就是利用lead的列-原来的时间列小于等于6就可以了,只要小于等于6,那么就符合条件(因为相减为7那么是8天,所以要相减为6),就输出。
我按照你给的数据,大概写一个,不一定能用(什么转换之类的我都没写,所以基本肯定不能直接用),不过意思你大概应该能明白。
seelct * from
(select a.人名,a.日期,lead(a.日期,4,null)over(partition by 人名 order by q.日期) 五次后的日期 from
(select 人名,trunc(时间,'dd')日期 from table geoup by 人名,trunc(时间,'dd')) a
) b where b. 五次后的日期-b.日期<=6
大概就是这么个意思。
第二步select查出来的内容,应该类似
张三 2001-10-1 2001-10-7
张三 2001-10-2 null(按照现有的数据来说就是null,这样就不能说是出现了5天了)
同样下面的张三也都是null
李四 2001-10-4 2001-10-10
李四 2001-10-6 2001-10-11
李四 2001-10-8 2001-10-12
(1)分组,因为是只要连续7天内5天即可,每天的次数并不重要,所以按照(人名和日期(不是时间是日期也就是截取到日)分组),这样可以去掉每天重复的次数。
(2)分好组后的内容,按照人名和日期排序。这样也就是说所有张三的都在一起,李四的都在一起,而且每个人的都是按照日期排序的。(这步其实不做也可以,因为下面的lead函数本身也可以分组排序,不过这样说对你来说更直观一些)
(3)利用lead函数(就是查某行数据的下几行的函数,可能你没有用过,我用的次数也不多。)往下查4行。
这个就是出现了5次,因为:四行+本身=5次,只要证明这5次发生在7天内就可以了。
(4)所以最后一步就是利用lead的列-原来的时间列小于等于6就可以了,只要小于等于6,那么就符合条件(因为相减为7那么是8天,所以要相减为6),就输出。
我按照你给的数据,大概写一个,不一定能用(什么转换之类的我都没写,所以基本肯定不能直接用),不过意思你大概应该能明白。
seelct * from
(select a.人名,a.日期,lead(a.日期,4,null)over(partition by 人名 order by q.日期) 五次后的日期 from
(select 人名,trunc(时间,'dd')日期 from table geoup by 人名,trunc(时间,'dd')) a
) b where b. 五次后的日期-b.日期<=6
大概就是这么个意思。
第二步select查出来的内容,应该类似
张三 2001-10-1 2001-10-7
张三 2001-10-2 null(按照现有的数据来说就是null,这样就不能说是出现了5天了)
同样下面的张三也都是null
李四 2001-10-4 2001-10-10
李四 2001-10-6 2001-10-11
李四 2001-10-8 2001-10-12
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询