重新做上升的温度这一题的时候,看到之前很多的题解,这里结合一些题解看看有什么能学到的,其实这一题我现在返回来看,刚开始看依旧没有思路,还是看了题解才有想法。
理一下学习的思路:这一题就是需要通过连接解题,连接两张相同的表 ,w1表作为今天的表 利用w1表的日期比w2表的日期大一天连接,w2表作为昨天的表,也就是今天连接昨天。
然后借着这一题,学习一下几个针对日期加减的函数。我还是放上这个题目吧,万一后来的人看不懂这个题。
1.下面是我原来的题解,也是那么多题解里面的第一个题解,现在回去看真的觉得是多次一举,这样的题解就是在装逼啊,根本没必要。
select id from (select id,temperature,recordDate,lag(temperature)over(order by recordDate) as last_temperature,lag(recordDate)over(order by recordDate) as last_date from Weather) as a where temperature>last_temperature and datediff(recordDate,last_date)=1;
我理解题目和题解之后就想出来下面的语句,但是提交之后就是不正确,然后我多看了几个别人的题解发现也有人犯了这个错误,你也看一下有没有什么问题呢?
select w1.id from weather w1, weather w2 where w1.recordDate=w2.recordDate+1 and w1.temperature>w2.temperature;
其实问题就是单独对日期加减是有可能出错的,原因如下
以下的两种操作是一样的,为什么呢?你理解笛卡尔积就明白了,根据我之前的博客https://blog.csdn.net/qq_45828965/article/details/134642986?spm=1001.2014.3001.5502,里面有一个我百度到别人的答案,就是因为笛卡尔连接也就是交叉连接有两种表达方式,下面两种题解就是。
select w1.id from weather w1, weather w2 where datediff(w1.recordDate,w2.recordDate)=1 and w1.temperature>w2.temperature;
select w1.id from weather w1 join weather w2 on datediff(w1.recordDate,w2.recordDate)=1 where w1.temperature>w2.temperature;
如果还不理解的话,看下图。
Datediff(begin日期,end日期)这个最简单了,而且感觉很常用啊
下面的图片中讲的很好:
1)首先adddate()有两种表述方法:date_add()和adddate()
2)其次里面的参数也有两种表述方法:
(日期,interval 差值,单位)=你想要的日期(interval这个关键字,中文代表间隔)
(日期,天数)=你想要的日期
这个函数有三个参数,timestampdiff(单位如DAY,begin日期,end日期)=差值
1)其中单位有如下选择:
2)日期有两种数据类型,date和datetime;而且还可以混合,至于可以怎么混合,需要的可以去找找,我这里将基本内容就行,到时候用到了自然会百度。
其实这个在这一道题完全没必要,很明显这里的日期最小也是日,很分秒这种的单位没有关系啊。但是这是为了学习一下这个函数。
dateadd(单位,差值,日期)=你想要的日期
单位有如下的选择
1)复习了交叉连接,自连接
2)日期不能擅自加减要斟酌
3)四个关于日期加减的函数:datediff(),timestamp(),adddate(),最后一个dateadd()是sql server的函数碰到了就一起放上来
4)温故而知新,之前菜鸟看到的东西就是不够多!!