新足迹

 找回密码
 注册

精华好帖回顾

· 家有9岁小闺女学音乐(钢琴➕大提琴)练习视频记录. 114 楼大提琴演出视频 ,139楼更新钢琴练习视频和老师点 (2018-10-9) always_pig · 海边拍日出,遇到梦寐以求的神光! (2013-9-9) 大米星星
· 自己在家做小吃——洗面筋的凉皮 (2005-1-20) 蜻蜓 · 北陆枫行--- 一个人的追枫之旅 (京都,东京,完结) (2016-8-11) woodywup
Advertisement
Advertisement
查看: 3159|回复: 52

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

发表于 2010-11-5 08:54 |显示全部楼层
此文章由 NoChoice 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 NoChoice 所有!转贴必须注明作者、出处和本声明,并保持内容完整
例如有这样的表
Name(string) Property(string)
----------------------------
zhang         1B
zhang         1C
li            1A
li            1B
li            1C
wang          1C
wang          1A
wang          2A
li            2C

想要拿出每个人某属性中如果前第一个字母相同但第二个字母最大的,因为属性是字符串,所以比较麻烦
我写了这样的,但是结果不对
    SELECT [Table].Name, Max([Table].Property) FROM [Table] GROUP BY Name;
只能拿到了这样的结果
Name Expr1001
---------------
li 2C
wang 2A
zhang 1C

我的结果想要是这样的
Name Expr1001
---------------
li 1C
li 2C
wang 2A
wang 1C
zhang 1C

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
签名不可外链
Advertisement
Advertisement

退役斑竹

发表于 2010-11-5 08:59 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我能想到的是用PARTITION做,但是应该有更简单的方法

特殊贡献奖章

发表于 2010-11-5 08:59 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我感觉只用sql做不到
等高手

发表于 2010-11-5 09:21 |显示全部楼层
此文章由 NNX 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 NNX 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这样可以吗

select
name,
SUBSTRING(property, 1,1) as groupcondition,
Max(property) as property
from test
group by name,SUBSTRING(property, 1,1)

评分

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

查看全部评分

2010年度奖章获得者

发表于 2010-11-5 09:22 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
my sql skill is so rusty.

but if you use Linq 2 SQL , easy

退役斑竹

发表于 2010-11-5 09:28 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 NNX 于 2010-11-5 10:21 发表
这样可以吗

select
name,
SUBSTRING(property, 1,1) as groupcondition,
Max(property) as property
from test
group by name,SUBSTRING(property, 1,1)


好像是可以的,再加个order by就完美了
Advertisement
Advertisement

2010年度奖章获得者

发表于 2010-11-5 09:29 |显示全部楼层

回复 6# 的帖子

此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
月亮, 你唱的那个歌, 有MTV吗?
:)

退役斑竹

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

2010年度奖章获得者

发表于 2010-11-5 09:34 |显示全部楼层

回复 8# 的帖子

此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
跟老马合唱的那个。

发表于 2010-11-5 09:35 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Assume u use sql server 2005 or upper....

DECLARE @Demo TABLE
(
  ID int IDENTITY(1,1),
  Name varchar(20),
  Property varchar(20)
)

INSERT INTO @Demo (Name, Property)
select 'zhang','1B'
union all
select 'zhang','1C'
union all
select 'li','1A'
union all
select 'li','1B'
union all
select 'li','1C'
union all
select 'li','2C'
union all
select 'wang','1C'
union all
select 'wang','1A'
union all
select 'wang','2A'

select * from @demo


;with PartitionCTE as
(
select ID,Name,Property,row_number() over (partition by Name,substring(Property,1,1) order by property desc) as "sq" from @Demo
)
select * from PartitionCTE where sq=1

退役斑竹

发表于 2010-11-5 09:35 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
祝福啊?杨承琳的,有MTV的
Advertisement
Advertisement

2010年度奖章获得者

发表于 2010-11-5 09:38 |显示全部楼层

回复 11# 的帖子

此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
发上来看看呀。

你是专业的,还是兴趣唱唱的? 没去唱歌真是可惜了。
头像被屏蔽

禁止发言

发表于 2010-11-5 09:41 |显示全部楼层

楼主要求标准SQL呢还是某种数据库的?

此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整

退役斑竹

发表于 2010-11-5 09:45 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-11-5 10:38 发表
发上来看看呀。

你是专业的,还是兴趣唱唱的? 没去唱歌真是可惜了。


http://www.56.com/u41/v_MTYyNDEzOTg.html
头像被屏蔽

禁止发言

发表于 2010-11-5 09:48 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
乱码大师, UNION 不就可以了, 为何union all?? 有什么特殊原因么?

原帖由 乱码 于 2010-11-5 10:35 发表
Assume u use sql server 2005 or upper....

DECLARE @Demo TABLE
(
  ID int IDENTITY(1,1),
  Name varchar(20),
  Property varchar(20)
)

INSERT INTO @Demo (Name, Property)
select 'zhang','1B'
union all ...
签名被屏蔽

特殊贡献奖章

发表于 2010-11-5 09:49 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
SUBSTRING不错,还从来没用过,这种情况都用script解决了

原帖由 月亮 于 2010-11-5 10:45 发表


http://www.56.com/u41/v_MTYyNDEzOTg.html

哪里有月亮的版本听?
Advertisement
Advertisement

发表于 2010-11-5 09:51 |显示全部楼层
此文章由 Dan.and.Andy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Dan.and.Andy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
substring(Property,1,1) ?

20C呢? LZ呢?

2010年度奖章获得者

发表于 2010-11-5 09:51 |显示全部楼层

回复 14# 的帖子

此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我是问有没有月亮版的。

你唱的比原唱要好。

发表于 2010-11-5 09:52 |显示全部楼层

回复 14# 的帖子

此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
agreed!!

没有partition之前,都得用group by.

发表于 2010-11-5 09:54 |显示全部楼层
此文章由 stevenbian 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 stevenbian 所有!转贴必须注明作者、出处和本声明,并保持内容完整
select name||substr(property,1,1),max(substr(property,2,1)) from test_rank group by name||substr(property,1,1) order by name||substr(property,1,1);

把字符串拆开再合并就有初步的结果了,然后想要什么就在拆。

[ 本帖最后由 stevenbian 于 2010-11-5 10:55 编辑 ]

发表于 2010-11-5 09:57 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 澳贼 于 2010-11-5 10:48 发表
乱码大师, UNION 不就可以了, 为何union all?? 有什么特殊原因么?



出于performance的考虑,union只作distinct value, union all是全部的value.

在sql server community,大家习惯性的建mockup table一般都用union all

kao,刚看到有"大师",真不敢当,你叫我“大湿”吧

[ 本帖最后由 乱码 于 2010-11-5 10:58 编辑 ]

评分

参与人数 1积分 +4 收起 理由
澳贼 + 4 又学习了.

查看全部评分

Advertisement
Advertisement

退役斑竹

发表于 2010-11-5 09:57 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-11-5 10:51 发表
我是问有没有月亮版的。

你唱的比原唱要好。


这个真没有。。

退役斑竹

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


出于performance的考虑,union只作distinct value, union all是全部的value.

在sql server community,大家习惯性的建mockup table一般都用union all


是的,union要排序+比较,速度会很慢。

发表于 2010-11-5 09:59 |显示全部楼层
此文章由 NoChoice 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 NoChoice 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 Dan.and.Andy 于 2010-11-5 10:51 发表
substring(Property,1,1) ?

20C呢? LZ呢?

对啊,这样不就有问题了?
签名不可外链

退役斑竹

发表于 2010-11-5 10:01 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 Dan.and.Andy 于 2010-11-5 10:51 发表
substring(Property,1,1) ?

20C呢? LZ呢?


根据LZ的描述“第一个字母相同但第二个字母最大”,最多只比较两位

特殊贡献奖章

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

对啊,这样不就有问题了?

可以用SUBSTRING(-1,1)先排字母
不会有20CC这种数据吧
Advertisement
Advertisement

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

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

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

[ 本帖最后由 NoChoice 于 2010-11-5 11:04 编辑 ]
签名不可外链

退役斑竹

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

对啊,这样不就有问题了?


要求到底是怎样的?从第一位非数字而不是从第二位开始判断?

那就需要再加一个判断条件,取数字+数字后第一位

[ 本帖最后由 月亮 于 2010-11-5 11:08 编辑 ]

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


根据LZ的描述“第一个字母相同但第二个字母最大”,最多只比较两位


你是很好的项目经理和BA人才, 一定能控制好budget. 俺们干这行的都是丑的问前头, 想到最复杂, 省的最后顶屎盆子.

发表于 2010-11-5 10:06 |显示全部楼层
此文章由 NoChoice 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 NoChoice 所有!转贴必须注明作者、出处和本声明,并保持内容完整
对于每一个人,属性:前面字符都一样的归类,最后一个字母最大的出列

发表回复

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

本版积分规则

Advertisement
Advertisement
返回顶部