在我们日常的统计过程中,统计连续N天出现的问题是比较常见的。比如统计连续三天销量大于10万的天数,统计一周客流量大于100的天数等等,今天我们用一个例子来告诉大家如何解决类似的问题。有一个体育馆,每天的路况信息记录在这三列信息中:序号(id)、日期(date)、路况(people)。请写一个查询语句找出高峰期,需要连续三天或以上,每天人流量不少于100人。例如体育场表:对于上面的示例数据,输出是:问题和期望的结果已经知道,如何解决?下面提供两种解决方法测试环境SQLServer2017思路一:通过求解求日期差如果某个日期前后的日期差分别为1和-1,则可知前后三条记录这个日期都是连续的。通俗地说,今天和前一天的差是1,今天和明天的差是-1,所以昨天、今天和明天的日期是连续的三天。具体解决方法如下:SELECTDISTINCTd.*FROMstadiudd,stadiumaWHEREABS(DATEDIFF(DAY,d.date,a.date))<2--求解时差绝对值为1或0的日期ANDa.dateIN(SELECTa.dateFROMstadiuma,stadiumb,stadiumcWHEREDATEDIFF(DAY,a.date,b.date)=1--今天减去昨天ANDDATEDIFF(DAY,a.date,c.date)=-1--今天到明天ANDa.people>99ANDb.people>99ANDc.people>99)思路2:根据id的连续性排列组合,这里分三种情况:三张表s1,s2,s3组合判断,(1)s1.id-s2.id=1,s2.id-s3.id=1,相当于s3s2s1三个连续的顺序(2)s2.id-s1.id=1,s1.id-s3.id=1,相当于顺序三个s3s1s2连续(3)s3.id-s2.id=1,s2.id-s1.id=1,相当于s1s2s3的顺序。三个连续的具体解如下:selectDISTINCTs1.*fromstadiums1,stadiums2,stadiums3wheres1.people>=100ands2.people>=100ands3.people>=100and((s1.id-s2.id=1ands2.id-s3.id=1)or(s2.id-s1.id=1ands1.id-s3.id=1)or(s3.id-s2.id=1ands2.id-s1.id=1))orderbys1.id;但这种方法仅限于适合的场景,如果超过3天,连续排列组合会增加,效果不是很好。以上两种思路都可以得到结果,小伙伴们可以自己尝试一下。
