新足迹

 找回密码
 注册

精华好帖回顾

· 全程纪录一下我的医牙过程。。。Nov 18 更新 (2009-10-28) fengcoolzi · 更新完毕 2018 圣诞日本之轻井泽-长野-小布施-松本-镰仓-东京 (2019-1-16) ailsalu
· 当微风如同飓风一般席卷足迹时---- 八一八我的使用心得 (2012-1-20) cathyyang · 爱折腾~之~rainwatertank安装实录(5月20日修订) (2007-5-18) AgeanSea
Advertisement
Advertisement
12
返回列表 发新帖
楼主:NoChoice

求高手这样的SQL怎么写 [复制链接]

发表于 2010-11-5 11:06 |显示全部楼层
此文章由 NNX 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 NNX 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 NoChoice 于 2010-11-5 11:03 发表
各位高手献身,谢谢。我想用标准的SQL语句解决这个功能(移植方便)
性能现在不太考虑,也就几万条~十几万条数据
如17#说的,如果是20C,或者2000C,好像就有问题了,有没有完美解决方案?
26#的情况应该没有,就是最后一个字母 ...


最后字母只可能一位的情况下, substring (property, 1, len(property)-1) ?
Advertisement
Advertisement

发表于 2010-11-5 11:09 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 NoChoice 于 2010-11-5 11:03 发表
各位高手献身,谢谢。我想用标准的SQL语句解决这个功能(移植方便)
性能现在不太考虑,也就几万条~十几万条数据

如17#说的,如果是20C,或者2000C,好像就有问题了,有没有完美解决方案?

26#的情况应该没有,就是最后一个字母 ...


用partition你随便加条件,用逗号分开就好,现在是partition by Name,substring(Property,1,1)
你可以改成:partition by Name,substring(Property,1,10),substring(Property,11,50).......

前提条件是比较的那些字符段的长度是一定的

评分

参与人数 1积分 +4 收起 理由
NoChoice + 4 感谢分享

查看全部评分

发表于 2010-11-5 11:22 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
完美的解决方案就是你把这个表变成,
name varchar(255), property1 int, property2 char(1)
或者#t
然后一切都好搞了
这是一个典型的,想用逻辑code解决设计缺陷的例子

评分

参与人数 2积分 +8 收起 理由
澳贼 + 4 一语中的!! 
NoChoice + 4 你太有才了

查看全部评分

If you let people believe that you are weak, sooner or later you’re going to have to kill them.

发表于 2010-11-5 11:23 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
substring遇到长度不同的话,order by就会不对,要用int

发表于 2010-11-5 11:27 |显示全部楼层
此文章由 choco2468 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 choco2468 所有!转贴必须注明作者、出处和本声明,并保持内容完整
技术性的东西 看了头痛, 我继续去找没营养的东西看... (monkey28)

发表于 2010-11-5 11:27 |显示全部楼层
此文章由 NoChoice 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 NoChoice 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 北风 于 2010-11-5 11:22 发表
完美的解决方案就是你把这个表变成,
name varchar(255), property1 int, property2 char(1)
或者#t
然后一切都好搞了
这是一个典型的,想用逻辑code解决设计缺陷的例子 ...

你说得太对了,这是一个典型的,想用逻辑code解决设计缺陷的例子
Design是多么重要啊(paopaobing(11))
签名不可外链
Advertisement
Advertisement

发表于 2010-11-5 11:44 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
change schema is BIG thing.your system might crash because of this.
不要忘了还有其他的针对这个table的operation

几十万条records不像是小小不然的table.

good luck!!
头像被屏蔽

禁止发言

发表于 2010-11-5 12:24 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2010-11-5 11:44 发表
change schema is BIG thing.your system might crash because of this.
不要忘了还有其他的针对这个table的operation

几十万条records不像是小小不然的table.

good luck!!


当然不是改,而是新建一个table.然后弄个程序feed
签名被屏蔽

发表于 2010-11-5 12:57 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 澳贼 于 2010-11-5 12:24 发表


当然不是改,而是新建一个table.然后弄个程序feed


这样data integrity会有问题,dba那边基本上通不过。

这种query在我经历的projects真的是小case,比它麻烦1000倍的多了去了,所以dba作data modeling的时候,一定得加倍小心,normalization/demoralization都要有令人信服的理由,这跟经验相当有关.
头像被屏蔽

禁止发言

发表于 2010-11-5 13:52 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2010-11-5 12:57 发表


这样data integrity会有问题,dba那边基本上通不过。

这种query在我经历的projects真的是小case,比它麻烦1000倍的多了去了,所以dba作data modeling的时候,一定得加倍小心,normalization/demoralization都要有令人信服的 ...


那就做个UDF解决??
签名被屏蔽

发表于 2010-11-5 14:12 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
说实话,没有人愿意去改schema,即使真的要改,也要多方参与,往往有时候很难周全
绝大多数时候,大家还只是抱怨一下,这设计不合理啊
然后忍了。。。所以很难要求完美

尽量避免用udf,个人觉得那是performance的毒药

用temporary table吧,虽然也不是很好的方法

当然直接那样substring再加group by也能行,只是不太清晰
partition在sql 2005之后才有
If you let people believe that you are weak, sooner or later you’re going to have to kill them.
Advertisement
Advertisement

退役斑竹

发表于 2010-11-5 14:19 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
从数据库角度来看,这个property完全没问题,并不需要改。不能为了取数据的时候方便而把一个数据分成两块来存储,这样取的时候是方便,但存的时候费劲了,还容易出错。而且从app调用的时候也费劲,要读两个column,然后粘一块儿

发表于 2010-11-5 14:24 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我不清楚楼主的具体情况,但是看起来这property是指2个property,只是当时设计的时候放在一起了


原帖由 月亮 于 5/11/2010 13:19 发表
从数据库角度来看,这个property完全没问题,并不需要改。不能为了取数据的时候方便而把一个数据分成两块来存储,这样取的时候是方便,但存的时候费劲了,还容易出错。而且从app调用的时候也费劲,要读两个column,然后粘一块儿 ...
If you let people believe that you are weak, sooner or later you’re going to have to kill them.

发表于 2010-11-5 14:30 |显示全部楼层
此文章由 IsDonIsGood 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 IsDonIsGood 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2010-11-5 12:57 发表


这样data integrity会有问题,dba那边基本上通不过。

这种query在我经历的projects真的是小case,比它麻烦1000倍的多了去了,所以dba作data modeling的时候,一定得加倍小心,normalization/demoralization都要有令人信服的 ...

同感,这不是掌握denormailize/noramilze原则就能做好的,根据不同的business requirements设计 变化很多,还要考虑到将来的可扩展性。没有经验真的是设计不出好的database schema
一旦db schema是bad design那开发维护的时候就惨了~~
still suffering~~

发表于 2010-11-5 14:31 |显示全部楼层
此文章由 IsDonIsGood 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 IsDonIsGood 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 北风 于 2010-11-5 14:12 发表
说实话,没有人愿意去改schema,即使真的要改,也要多方参与,往往有时候很难周全
绝大多数时候,大家还只是抱怨一下,这设计不合理啊
然后忍了。。。所以很难要求完美

尽量避免用udf,个人觉得那是performance的毒药

用temporar ...


这种情况下temporary table是个不错的方法,而且数据不是多,应该不会有performance的问题
头像被屏蔽

禁止发言

发表于 2010-11-5 16:40 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 北风 于 2010-11-5 14:12 发表
说实话,没有人愿意去改schema,即使真的要改,也要多方参与,往往有时候很难周全
绝大多数时候,大家还只是抱怨一下,这设计不合理啊
然后忍了。。。所以很难要求完美

尽量避免用udf,个人觉得那是performance的毒药

用temporar ...


UDF 不也是建temp table,然后包装一下么?
签名被屏蔽
Advertisement
Advertisement

退役斑竹 2007 年度奖章获得者 2008年度奖章获得者 特殊贡献奖章 参与宝库编辑功臣

发表于 2010-11-5 17:31 |显示全部楼层
此文章由 黑山老妖 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 黑山老妖 所有!转贴必须注明作者、出处和本声明,并保持内容完整
oracle PL/SQL 可以做到。
你是MS Access我就不知道了。

[ 本帖最后由 黑山老妖 于 2010-11-5 17:32 编辑 ]

退役斑竹 2007 年度奖章获得者 2008年度奖章获得者 特殊贡献奖章 参与宝库编辑功臣

发表于 2010-11-5 17:40 |显示全部楼层
此文章由 黑山老妖 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 黑山老妖 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Oracle这么做:

select name, substr(property,1,1)||max(substr(property,2,1) as property
from table
group by name, substr(property,1,1)

大家给我加分吧。

[ 本帖最后由 黑山老妖 于 2010-11-5 17:43 编辑 ]

评分

参与人数 2积分 +8 收起 理由
kr2000 + 5 oracle效率挺高
乱码 + 3 你太有才了

查看全部评分

Happy Wife = Happy Life

特殊贡献奖章

发表于 2010-11-8 10:40 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 黑山老妖 于 2010-11-5 17:40 发表
Oracle这么做:

select name, substr(property,1,1)||max(substr(property,2,1) as property
from table
group by name, substr(property,1,1)

大家给我加分吧。

substr(property,1,1)||max(substr(property,2,1) as property 这句怎么解?

发表于 2010-11-8 10:54 |显示全部楼层
此文章由 lxp 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 lxp 所有!转贴必须注明作者、出处和本声明,并保持内容完整
设计的人不懂开发,也没有遵从有繁到简的原则,没有遵守第一范式,结果是把复杂的应用引到开发去。

退役斑竹 2007 年度奖章获得者 2008年度奖章获得者 特殊贡献奖章 参与宝库编辑功臣

发表于 2010-11-8 12:02 |显示全部楼层
此文章由 黑山老妖 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 黑山老妖 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 kr2000 于 8/11/2010 10:40 发表

substr(property,1,1)||max(substr(property,2,1) as property 这句怎么解?


substr(property,1,1) <= 取property里面的第一个字节。
max(substr(property,2,1) <= 取property里面的第二字节的最大值,因为用了group by所以可以这么做。
|| <= 是string concatenation

评分

参与人数 1积分 +4 收起 理由
kr2000 + 4 谢谢奉献

查看全部评分

Happy Wife = Happy Life
Advertisement
Advertisement

退役斑竹 2007 年度奖章获得者 2008年度奖章获得者 特殊贡献奖章 参与宝库编辑功臣

发表于 2010-11-8 12:14 |显示全部楼层
此文章由 黑山老妖 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 黑山老妖 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 lxp 于 8/11/2010 10:54 发表
设计的人不懂开发,也没有遵从有繁到简的原则,没有遵守第一范式,结果是把复杂的应用引到开发去。


By the time you realise how bad someone has designed something, it's usually too late to change it. You can only work around it or try to optimise it.
Speaking from experience here...
(paopaobing(40))
Happy Wife = Happy Life

发表于 2010-11-9 23:09 |显示全部楼层

非SQL,只是凑个热闹啊。

此文章由 rdcwayx 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rdcwayx 所有!转贴必须注明作者、出处和本声明,并保持内容完整
  1. $ cat infile
  2. Name(string) Property(string)
  3. ----------------------------
  4. zhang         1B
  5. zhang         1C
  6. li            1A
  7. li            1B
  8. li            1C
  9. wang          1C
  10. wang          1A
  11. wang          2A
  12. li            2C

  13. $ awk '
  14. NR>2{split($2,a,"");b[$1 FS a[1]]=(b[$1 FS a[1]]>a[2])?b[$1 FS a[1]]:a[2]}
  15. END{for (i in b) print i b[i]}
  16. ' infile

  17. li 1C
  18. li 2C
  19. wang 1C
  20. wang 2A
  21. zhang 1C
复制代码

评分

参与人数 1积分 +6 收起 理由
黑山老妖 + 6 感谢分享

查看全部评分

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部