这关怎么过!提示:两个0,关于思维的名言发散一下

一个语句思考过程引发的思考
一个语句思考过程引发的思考
编辑:www.fx114.net
本篇文章主要介绍了"一个语句思考过程引发的思考
0",主要涉及到一个语句思考过程引发的思考
0方面的内容,对于一个语句思考过程引发的思考
0感兴趣的同学可以参考一下。
一个语句思考过程引发的思考
昨天?前天的一个思考过程,希望对对思考有兴趣的朋友有些帮助!
一个字段的表,怎么样过滤掉冗余数据,用一句SQL写出来!
冗余数据的条件:
&&&&&相同记录只取一条。
&&&&&在没有相同记录的时,前后两条记录的差必须大于1。
说明:nNum为一int,有可能重复。需要选出这样结果
条件是这样的:
(1)现把nNum有重复的记录去掉。并升序排列。则得到(1,2,3,4)
(2)然后第二条减去第一条nNum
&&&&&&&&&&&如果等1,则去掉第二条记录。=&(1,3,4),重复(2)
&&&&&&&&&&&如果大于1,则用第三条减第二条判断同上。第四条-第三条。。。。
(1,1,2,3,3,5,7,9,10)=&
(1,2,3,5,7,9,10)=&
(1,3,5,7,9,10)=&
(1,3,5,7,9)=&最所需要的结果。
分析过程:
1-1、过滤重复记录&当然使用disktinct&关键字&记下&(select&distinct&num&from&table&)&视图1&是第一步没有重复数据的视图
1-2、得出结论&:每条记录&必须依靠它前一条记录来判断它是否存在:1前面没有数字存在,2前面有1&取掉,3本来有2但2被除去,所以也留下……于是得出结论:是一个循环递归的判断,似乎没有一句话实现的方法。
2-1、不死心,睡觉以后继续观察,发现&事实上可以在&视图1里得到&绝对要保留的数据(不存在-1num的值),于是得出视图2:
select&*&from&&视图1&k2&
where&(select&count(*)&from
&&视图1&k3
where&&k3.num-k2.num=1)=0
包含了所有初步必选项目。
并同时派生出视图3,包含其他项目:
select&*&from&&视图1&k2&
where&(select&count(*)&from
&&视图1&k3
where&&k2.num-k3.num=1)&0
2-2、但还有一个问题没有解决,那其他该存在的数据该如何判断?既然头大,就先不判断,出去走走再说。
3-1、发现如果把视图2里面的数据作为分界点,可以把视图1分为可以界定的有限部分,且没部分都是连续的,假设k为一个段的分界点,那么&k+1被删除,k+2留下,k+3删除,k+4留下……即2k+2的数据留下
推翻1-2,发现视图4:该视图包含了第二待选项目
select&num&&from&
select&k3.num,max(k2.num)&cnt
&from&视图3&k3,视图2&k2&
& where&k3.num&k2.num&&droup&by&k3.num&
& where&(kx.t)%2=0
3-2、于是所有的结果就出来了,对于多列语句就有视图5包含合格的列:
select&*&from&k&&where&k.num&in&(select&num&from&视图2)
&&&&&&&&or&k.num&in&(select&num&&视图4)
4-1、吃完午饭发现既然只有一列,而且对于视图2的数据也符合视图4的规则:(k-k)%2=0
于是改进&语句,直接成为视图六:
select&t.num&from&
(select&distinct&num&from&[table])&t,
(select&*&from&(select&distinct&num&from&[table])&t&where&
(select&count(*)&from&(select&distinct&num&from&[table])&t2&where&t.num-t2.num=1)=0&&&&
where&t.num&=t2.num&
group&&by&t.num&
having&(t.num-max(t2.num))%2=0
order&by&num
4-2,感觉完美了,睡觉!
5-1、有朋友认为&视图6&没有美感,认为可以变形为视图7:
select&&distinct&num
where&((select&max(num)&
&&&&&&&from&#t&B&
&&&&&&&where&num&=T.num&
&&&&&&&and&not&exists(select&1&
&&&&&&&&&&&&&&&&&&&&&&from&#t&
&&&&&&&&&&&&&&&&&&&&&&where&num=B.num-1)
&&&&&&)-T.num)%2=0
drop&table&#t
观察:视图7&语句简练,可理解性也强,但使用了子查询,可能会有改进余地。
再次思考:
视图4有还改进余地,&去掉多余子句,使用更快速的not&exists判断,&再加上&&视图六&的思想&,得到视图8:
select&&k.num
from&[table]&k,
(select&num&from&[table]&where&not&exists&(select&1&from&[table]&k3&where&k3.num=[table].num-1)&)&k2
where&k.num&=k2.num&
group&by&k.num
having&(k.num-max(k2.num))%2=0
order&by&k.num&
测试:视图8比视图6有10倍的提高。
至此,改进工作告一段落,但却由此引发了思考:
附:测试数据:
declare&@krs&table&(NUM&INT)
DECLARE&@X&VARCHAR(30)
SET&@X='1,1,2,3,3,4,6,7,8,9,10,'
WHILE&@X&&''
INSERT&INTO&@KRS&(NUM)&VALUES&(LEFT(@X,(CHARINDEX(',',@X)-1)&)&&)
SET&@X=RIGHT(@X,LEN(@X)-CHARINDEX(',',@X))
累了,回家睡觉,明天再写感想楼主高人也,我也研究过,就是没有楼主深刻,今后多向楼主学习。确实高人!最后一句快太多了。视图8比视图7 要快6倍以上!继续写....坐着听...谢谢楼上两位。
过奖了,我的优点是很少放弃思考而已,任何一个&较熟练的sql&使用者如果多花时间思考(当然长度可能不一样)都可以得到这个结果。
希望在学习的过程中可以共勉就是了!
本来想再多写一些,但想如果由多点人提提意见再写会更好,就停笔了:)
回想这个过程,会发现最成功的一点是能够一直突破思路,改进方案;
最不成功的一点是太过依赖经验,又总是不够经验,于是总是自己的前一个方案束缚自己的下一个方案。
让我们来分析下过程的过程:
1-1、在思考&视图1&的时候&根据经验&理所当然地选择&distinct&作为唯一侯选方案,却忘了过滤大量重复的另外一个高效率方法:group&by(也是经验不足的表现)。
于是有了两个很不好的效果:
1、在以后思考问题的时候下意识地不使用&原始数据&进行思考,而是直接使用&视图1&进行思考,于是在生成代码的时候&大量重复使用了&视图1&作为原始数据代码,直接导致&distinct&多次多余重复使用,严重降低前期代码的效率。
2、忘记了distinct&可以使用&group&by得到重复的效果。
1-2、根据常识:循环就无法通过单个语句实现。这句话很对,但终于限制了发散思维。
2-1、好的开头是成功的一半:即使已经认定了不可能实现我们也不妨研究一下即使没办法完全实现,也研究下可以实现到什么程度,用这样的态度完成学习绝对不会没有收获。于是写下&根据&1思考&&得到的两个&结果视图,这步最大的成功就是把问题明确分成两个部分,直接导致了思维模式的转变,是最后完成的有力保障。
2-2、不知道是一个好习惯还是坏习惯,个人比较倾向于解决不了问题的时候边做其他事情边稍微想想。
3-1、常识一般是对的,但有时候&并不可以因为常识终止动作:很多时候我们可以绕过常识,换一种角度观察数据发现几乎可以完全抛开常识的影响,既然可以把数据分成有限段,起点又是已知的,那理论上对每个数据的起点都是已知的。这时候终于想起了join&和group&by这两种高效率的方式。(我这里想提醒初学sql&的同人注意:join&可以使用&的运算符不止是=,可以是任何有效的逻辑表达式,甚至是&is&null&;group&by&是在一堆数据里取特征数据最有效的方法&min&&max&count&avg&很多时候让你在处理&结果集无所适从的时候可以解放出来(另一个误区:一行记录/没有记录事实上也是一个结果集,可以用结果集的方法进行运算))
这里的成功在于&突破了1-1。
3-2、是成功也是失败:
&&&&&&2-1的思维定势导致代码&冗长&、烦琐&、不好理解、效率低下&&但结果总算出来了:)
4-1、突破了2-1思维的定势,再次把&所有&数据&作为一部分数据处理,但1-1的影响却使得自己忘了&group&by&的简单应用。
4-2、他山之石,可以攻玉(当然,视图7不是石头,缺点在于忘了效率)。
没什么,就是因为他代码少、漂亮,所以觉得自己的代码也可以更少、更漂亮。而且他使用了双重的子查询,速度估计会改进余地。
&看到了not&exists&想自己怎么那么笨一直用select&count&,于是继续反思其他语句有没有类似低能错误的发生,工夫不负有心人,终于发现了group&by&可以直接消除重复,简化了视图6以后&效果出乎意料的好。
可以看见,对经验的依赖和经验的缺少是两个很容易犯的错误,同时又是很矛盾的事情,本例里,如果没有&使用&distinct&的经验,如果有&解决分段问题的经验,会是完全不同的高效过程。
但学习,总要有不肯放弃的精神、勇于怀疑的勇气、探索路径绕过障碍的智慧。本例里,我虽然走了很多弯路,但在以后的问题里,这样的弯路长度会直接降下来,就像视图8和视图6的对比一样!
对学习有决心的朋友们,共勉之!由个地方写错了
3-1、常识一般是对的,但有时候&并不可以因为常识终止动作:很多时候我们可以绕过常识,换一种角度观察数据发现几乎可以完全抛开常识的影响,既然可以把数据分成有限段,起点又是已知的,那理论上对每个数据的起点都是已知的。这时候终于想起了join&和group&by这两种高效率的方式。(我这里想提醒初学sql&的同人注意:join&可以使用&的运算符不止是=,可以是任何有效的逻辑表达式,甚至是&is&null&;group&by&是在一堆数据里取特征数据最有效的方法&min&&max&count&avg&很多时候让你在处理&结果集无所适从的时候可以解放出来(另一个误区:一行记录/没有记录事实上也是一个结果集,可以用结果集的方法进行运算))
这里的成功在于&突破了1-1。&&//这里的1-1应为1-2
1-1在最后一步才完全突破。好久没有听到这么精彩的讲课了,收藏。稍做整理:
一个语句思考过程引发的思考
A&部分:引起思考的&题目
一个字段的表,怎么样过滤掉冗余数据,用一句SQL写出来!
冗余数据的条件:
&&&&&相同记录只取一条。
&&&&&在没有相同记录的时,前后两条记录的差必须大于1。
说明:nNum为一int,有可能重复。需要选出这样结果
条件是这样的:
(1)现把nNum有重复的记录去掉。并升序排列。则得到(1,2,3,4)
(2)然后第二条减去第一条nNum
&&&&&&&&&&&如果等1,则去掉第二条记录。=&(1,3,4),重复(2)
&&&&&&&&&&&如果大于1,则用第三条减第二条判断同上。第四条-第三条。。。。
(1,1,2,3,3,5,7,9,10)=&
(1,2,3,5,7,9,10)=&
(1,3,5,7,9,10)=&
(1,3,5,7,9)=&最所需要的结果。
B部分:问题分析/解决过程
1-1、过滤重复记录&当然使用disktinct&关键字&记下&(select&distinct&num&from&table&)&视图1&是第一步没有重复数据的视图
1-2、得出结论&:每条记录&必须依靠它前一条记录来判断它是否存在:1前面没有数字存在,2前面有1&取掉,3本来有2但2被除去,所以也留下……于是得出结论:是一个循环递归的判断,似乎没有一句话实现的方法。
2-1、不死心,睡觉以后继续观察,发现&事实上可以在&视图1里得到&绝对要保留的数据(不存在-1num的值),于是得出视图2:
select&*&from&&视图1&k2&
where&(select&count(*)&from
&&视图1&k3
where&&k2.num-k3.num=1)=0
包含了所有初步必选项目。
并同时派生出视图3,包含其他项目:
select&*&from&&视图1&k2&
where&(select&count(*)&from
&&视图1&k3
where&&k2.num-k3.num=1)&0
2-2、但还有一个问题没有解决,那其他该存在的数据该如何判断?既然头大,就先不判断,出去走走再说。
3-1、发现如果把视图2里面的数据作为分界点,可以把视图1分为可以界定的有限部分,且每部分都是连续的,假设k为一个段的分界点,那么&k+1被删除,k+2留下,k+3删除,k+4留下……即2k+2的数据留下
推翻1-2,发现视图4:该视图包含了第二待选项目
select&num&&from&
select&k3.num,max(k2.num)&cnt
&from&视图3&k3,视图2&k2&
& where&k3.num&k2.num&&droup&by&k3.num&
& where&(kx.t)%2=0
3-2、于是所有的结果就出来了,对于多列语句就有视图5包含合格的列:
select&*&from&k&&where&k.num&in&(select&num&from&视图2)
&&&&&&&&or&k.num&in&(select&num&&视图4)
4-1、吃完午饭发现既然只有一列,而且对于视图2的数据也符合视图4的规则:(k-k)%2=0
于是改进&语句,直接成为视图六:
select&t.num&from&
(select&distinct&num&from&[table])&t,
(select&*&from&(select&distinct&num&from&[table])&t&where&
(select&count(*)&from&(select&distinct&num&from&[table])&t2&where&t.num-t2.num=1)=0&&&&
where&t.num&=t2.num&
group&&by&t.num&
having&(t.num-max(t2.num))%2=0
order&by&num
4-2,感觉完美了,睡觉!
5-1、有朋友认为&视图6&没有美感,认为可以变形为视图7:
select&&distinct&num
where&((select&max(num)&
&&&&&&&from&#t&B&
&&&&&&&where&num&=T.num&
&&&&&&&and&not&exists(select&1&
&&&&&&&&&&&&&&&&&&&&&&from&#t&
&&&&&&&&&&&&&&&&&&&&&&where&num=B.num-1)
&&&&&&)-T.num)%2=0
观察:视图7&语句简练,可理解性也强,但使用了子查询,可能会有改进余地。
再次思考:
视图4有还改进余地,&去掉多余子句,使用更快速的not&exists判断,&再加上&&视图六&的思想&,得到视图8:
select&&k.num
from&[table]&k,
(select&num&from&[table]&where&not&exists&(select&1&from&[table]&k3&where&k3.num=[table].num-1)&)&k2
where&k.num&=k2.num&
group&by&k.num
having&(k.num-max(k2.num))%2=0
order&by&k.num&
测试结果出乎意料:视图8比视图6几乎有10倍的提高。
至此,改进工作告一段落。C部分:反思思考过程
回想这个过程,会发现最成功的一点是能够一直突破思路,改进方案;
最不成功的一点是太过依赖经验,又总是不够经验,于是总是自己的前一个方案束缚自己的下一个方案。
让我们来分析下分析过程的过程:
1-1、在思考&视图1&的时候&根据经验&理所当然地选择&distinct&作为唯一侯选方案,却忘了过滤大量重复的另外一个高效率方法:group&by(也是经验不足的表现)。
于是有了两个很不好的效果:
&&&&1、在以后思考问题的时候下意识地不使用&原始数据&进行思考,而是直接使用&视图1&进行思考,于是在生成代码的时候&大量重复使用了&视图1&作为原始数据代码,直接导致&distinct&多次多余重复使用,严重降低前期代码的效率。
&&&&2、忘记了distinct&可以使用&group&by得到重复的效果。
1-2、根据常识:循环就无法通过单个语句实现。这句话很对,但终于限制了发散思维。
2-1、好的开头是成功的一半:即使已经认定了不可能实现我们也不妨研究一下即使没办法完全实现,也研究下可以实现到什么程度,用这样的态度完成学习绝对不会没有收获。于是写下&根据&1思考&&得到的两个&结果视图,这步最大的成功就是把问题明确分成两个部分,直接导致了思维模式的转变,是最后完成的有力保障。
2-2、不知道是一个好习惯还是坏习惯,个人比较倾向于解决不了问题的时候边做其他事情边稍微想想。
3-1、常识一般是对的,但有时候&并不可以因为常识终止动作:很多时候我们可以绕过常识,换一种角度观察数据发现几乎可以完全抛开常识的影响,既然可以把数据分成有限段,起点又是已知的,那理论上对每个数据的起点都是已知的。这时候终于想起了join&和group&by这两种高效率的方式。(我这里想提醒初学sql&的同人注意:join&可以使用&的运算符不止是=,可以是任何有效的逻辑表达式,甚至是&is&null&;group&by&是在一堆数据里取特征数据最有效的方法&min&&max&count&avg&很多时候让你在处理&结果集无所适从的时候可以解放出来(另一个误区:一行记录/没有记录事实上也是一个结果集,可以用结果集的方法进行运算))
这里的成功在于&突破了1-2。
3-2、是成功也是失败:
&&&&&&2-1的思维定势导致代码&冗长&、烦琐&、不好理解、效率低下&&但结果总算出来了:)
4-1、突破了2-1思维的定势,再次把&所有&数据&作为一部分数据处理,但1-1的影响却使得自己忘了&group&by&的简单应用。
4-2、他山之石,可以攻玉(当然,视图7不是石头,缺点在于忘了效率)。
没什么,就是因为他代码少、漂亮,所以觉得自己的代码也可以更少、更漂亮。而且他使用了双重的子查询,速度估计会改进余地。
5-1&看到了not&exists&想自己怎么那么笨一直用select&count&,于是继续反思其他语句有没有类似低能错误的发生,工夫不负有心人,终于发现了group&by&可以直接消除重复,于是在最后突破了&1-1的定势&;简化了视图6以后&效果出乎意料的好。
可以看见,对经验的依赖和经验的缺少是两个很容易犯的错误,同时又是很矛盾的事情,本例里,如果没有&使用&distinct&的经验,如果有&解决分段问题的经验,会是完全不同的高效过程。
但学习,总要有不肯放弃的精神、勇于怀疑的勇气、探索路径绕过障碍的智慧。本例里,我虽然走了很多弯路,但在以后的问题里,这样的弯路长度会直接降下来,就像视图8和视图6的对比一样!
对学习有决心的朋友们,共勉之!
附:测试数据:仅运行于sql&server&2000
declare&@krs&table&(NUM&INT)
DECLARE&@X&VARCHAR(8000)
SET&@X='1,1,2,3,3,4,6,7,8,9,10,'
WHILE&@X&&''
INSERT&INTO&@KRS&(NUM)&VALUES&(LEFT(@X,(CHARINDEX(',',@X)-1)&)&&)
SET&@X=RIGHT(@X,LEN(@X)-CHARINDEX(',',@X))
END看来水平不够,没吸引力。
情绪--精彩精彩,
在CSDN&SQL版,除了按钮,没有人是能这么分析.
但是没一开始参于那个问题,不是好体会.打开眼界把它转移到基础类来吧,这个帖子应该放到FAQ里heihei!&俺不想受累,还是多条SQL实现吧!
declare&@t&table(row&int&identity&primary&key,num&int&unique)
insert&@table(num)&select&distinct&num&from&[table]
delete&@t&where&row&%&2&=&0
select&num&from&@t其实,单条SQL只要是把多条SQL嵌套起来就行了,不过有时确实表达起来不清不楚的。现在,有了基于内存的“表型变量”,不必使用临时表,那么把一条SQL写成几条SQL有时反而效率高。楼上的可能对。。。。。。因为每个段的起点&&row%2未必=0错了。等一下。过程吗,感觉比较简单的是这个:
和查询速度差不多
declare&@tmp_int&int
,&&&&&&&@tmp_int2&int
declare&@tmp_table&table&(t&int)
declare&#tmp_int&cursor&for&select&distinct&num&from&[table]&order&by&num
open&#tmp_int
fetch&from&#tmp_int&into&@tmp_int
while&@@fetch_status=0
&&&&&&if&@tmp_int&(@tmp_int2+1)&or&@tmp_int2&is&null&
&&&&&&&&&begin
&&&&&&&&&&&&&insert&into&@tmp_table&(t)&values&(@tmp_int)
&&&&&&&&&&&&&set&@_int
&&&&&&&&&end
&&&&&fetch&from&#tmp_int&into&@tmp_int
close&#tmp_int&
deallocate&#tmp_int&
select&*&from&@tmp_tabledeclare&@t&table(num&int&primary&key)
declare&@p&int
insert&@t(num)&select&distinct&num&from&[table]
&&select&top&1&@p=num&from&@t&as&a&where&num&@p&and&
&&&&exists(select&*&from&@t&where&num=a.num-1)
&&if&@@rowcount=0&break
&&delete&@t&where&
select&num&from&@t俺的习惯:不用游标、不用临时表。上面的primary&key很必要!
不用游标,不用临时表,已经确保在内存中运行算法,所以效率可以保证比较高,所以就不一定不用循环,如果它比单条SQL还好。主要是在原贴上,楼主要求只能用一句.
所以针对那个问题realgz&(realgz)&的方法是很好的
但把问题扩大.针对实际中常用的方法.
用游标当然是最笨的.
用循环也不是好办法.
要用UPDATE方式批处理.是的,但UPDATE似乎也需要一个循环。对,不需要&生成了视图2就不需要了。。。用多语句好象更慢。有什么加快的方法?
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:403 Forbidden
403 Forbidden
You don't have permission to access the URL on this server.Powered by Tengine杰小鬼的发散性思维?【真夏夜的银梦吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:8,217贴子:
杰小鬼的发散性思维?收藏
啊啊啊,淫警察搞不过真警察
下面还有个铪小鬼呢
没有淫警察就好(字面的意味)
三图的梗是跟一些杰无关图成系列的。就本身来说还是有点草的,一般有人发这图的话也很少看见ky杰小鬼。
猛男也开始泛滥了,说大秦话越来越像无脑玩梗了
weico客户端喜欢
后看戏,反正看直播的也就那么点人
喂,有女朋友吗沙币!(半怒)
九千万社保,九万关注,九十观众苟苟韦天(他力本愿)
啊 原田太志先辈的表情包被改成这样了
赵方尬秦,牙白哟感觉有十万甚至九万个傀儡妹正在前往比比汗丽丽
登录百度帐号推荐应用}

我要回帖

更多关于 关于逻辑思维的书籍 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信