设为首页 收藏本站
查看: 728|回复: 0

[经验分享] SQL去除

[复制链接]

尚未签到

发表于 2016-11-7 06:19:44 | 显示全部楼层 |阅读模式
我的原始问题  Name Path Time

1    c:   20:00

1   
f:   20:00

1    d:   21:00

2    f:   20:00


要求返回

1   
c:  

2    f:  



1    f:  

2    f:  

不能返回

1   
c:  

1    f:  

2    f:  



这里面没有主键,要求返回前两列select
Name,Path ,要求相同的Name的元组集合中取Time最小的,剩余的不能取出

经过搜索,
找到以下newb code,特以珍藏


SQL code

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->--
假如DB2中转换varchar型数据为int行数据为cast,同SQL server一样.


select
t.
*

from
testsql t
where

cast
(hours
as

int
)
=
(
select

max
(
cast
(hours
as

int
))
from
testsql
where
name
=
t.name)
order

by
name

--
类似SQL server的诸多写法见下:

--

按某一字段分组取最大(小)值所在行的数据


(爱新觉罗.毓华
2007
-
10
-
23于浙江杭州)

/*

数据如下:
name val memo
a    2   a2(a的第二个值)
a    1   a1--a的第一个值
a    3   a3:a的第三个值
b    1   b1--b的第一个值
b    3   b3:b的第三个值
b    2   b2b2b2b2
b    4   b4b4
b    5   b5b5b5b5b5

*/


--
创建表并插入数据:


create

table
tb(name
varchar
(
10
),val
int
,memo
varchar
(
20
))

insert

into
tb
values
(
'
a
'
,   
2
,   
'
a2(a的第二个值)
'
)

insert

into
tb
values
(
'
a
'
,   
1
,   
'
a1--a的第一个值
'
)

insert

into
tb
values
(
'
a
'
,   
3
,   
'
a3:a的第三个值
'
)

insert

into
tb
values
(
'
b
'
,   
1
,   
'
b1--b的第一个值
'
)

insert

into
tb
values
(
'
b
'
,   
3
,   
'
b3:b的第三个值
'
)

insert

into
tb
values
(
'
b
'
,   
2
,   
'
b2b2b2b2
'
)

insert

into
tb
values
(
'
b
'
,   
4
,   
'
b4b4
'
)

insert

into
tb
values
(
'
b
'
,   
5
,   
'
b5b5b5b5b5
'
)

go


--
一、按name分组取val最大的值所在行的数据。

--

方法1:


select
a.
*

from
tb a
where
val
=
(
select

max
(val)
from
tb
where
name
=
a.name)
order

by
a.name

--
方法2:


select
a.
*

from
tb a
where

not

exists
(
select

1

from
tb
where
name
=
a.name
and
val
>
a.val)

--
方法3:


select
a.
*

from
tb a,(
select
name,
max
(val) val
from
tb
group

by
name) b
where
a.name
=
b.name
and
a.val
=
b.val
order

by
a.name

--
方法4:


select
a.
*

from
tb a
inner

join
(
select
name ,
max
(val) val
from
tb
group

by
name) b
on
a.name
=
b.name
and
a.val
=
b.val
order

by
a.name

--
方法5


select
a.
*

from
tb a
where

1

>
(
select

count
(
*
)
from
tb
where
name
=
a.name
and
val
>
a.val )
order

by
a.name

/*

name       val         memo                 
---------- ----------- --------------------
a          3           a3:a的第三个值
b          5           b5b5b5b5b5

*/


--
二、按name分组取val最小的值所在行的数据。

--

方法1:


select
a.
*

from
tb a
where
val
=
(
select

min
(val)
from
tb
where
name
=
a.name)
order

by
a.name

--
方法2:


select
a.
*

from
tb a
where

not

exists
(
select

1

from
tb
where
name
=
a.name
and
val
<
a.val)

--
方法3:


select
a.
*

from
tb a,(
select
name,
min
(val) val
from
tb
group

by
name) b
where
a.name
=
b.name
and
a.val
=
b.val
order

by
a.name

--
方法4:


select
a.
*

from
tb a
inner

join
(
select
name ,
min
(val) val
from
tb
group

by
name) b
on
a.name
=
b.name
and
a.val
=
b.val
order

by
a.name

--
方法5


select
a.
*

from
tb a
where

1

>
(
select

count
(
*
)
from
tb
where
name
=
a.name
and
val
<
a.val)
order

by
a.name

/*

name       val         memo                 
---------- ----------- --------------------
a          1           a1--a的第一个值
b          1           b1--b的第一个值

*/


--
三、按name分组取第一次出现的行所在的数据。


select
a.
*

from
tb a
where
val
=
(
select

top

1
val
from
tb
where
name
=
a.name)
order

by
a.name

/*

name       val         memo                 
---------- ----------- --------------------
a          2           a2(a的第二个值)
b          1           b1--b的第一个值

*/


--
四、按name分组随机取一条数据。


select
a.
*

from
tb a
where
val
=
(
select

top

1
val
from
tb
where
name
=
a.name
order

by

newid
())
order

by
a.name

/*

name       val         memo                 
---------- ----------- --------------------
a          1           a1--a的第一个值
b          5           b5b5b5b5b5

*/


--
五、按name分组取最小的两个(N个)val


select
a.
*

from
tb a
where

2

>
(
select

count
(
*
)
from
tb
where
name
=
a.name
and
val
<
a.val )
order

by
a.name,a.val

select
a.
*

from
tb a
where
val
in
(
select

top

2
val
from
tb
where
name
=
a.name
order

by
val)
order

by
a.name,a.val

select
a.
*

from
tb a
where

exists
(
select

count
(
*
)
from
tb
where
name
=
a.name
and
val
<
a.val
having

Count
(
*
)
<

2
)
order

by
a.name

/*

name       val         memo                 
---------- ----------- --------------------
a          1           a1--a的第一个值
a          2           a2(a的第二个值)
b          1           b1--b的第一个值
b          2           b2b2b2b2

*/


--
六、按name分组取最大的两个(N个)val


select
a.
*

from
tb a
where

2

>
(
select

count
(
*
)
from
tb
where
name
=
a.name
and
val
>
a.val )
order

by
a.name,a.val

select
a.
*

from
tb a
where
val
in
(
select

top

2
val
from
tb
where
name
=
a.name
order

by
val
desc
)
order

by
a.name,a.val

select
a.
*

from
tb a
where

exists
(
select

count
(
*
)
from
tb
where
name
=
a.name
and
val
>
a.val
having

Count
(
*
)
<

2
)
order

by
a.name

/*

name       val         memo                 
---------- ----------- --------------------
a          2           a2(a的第二个值)
a          3           a3:a的第三个值
b          4           b4b4
b          5           b5b5b5b5b5

*/


--
七,如果整行数据有重复,所有的列都相同。

/*


数据如下:
name val memo
a    2   a2(a的第二个值)
a    1   a1--a的第一个值
a    1   a1--a的第一个值
a    3   a3:a的第三个值
a    3   a3:a的第三个值
b    1   b1--b的第一个值
b    3   b3:b的第三个值
b    2   b2b2b2b2
b    4   b4b4
b    5   b5b5b5b5b5

*/


--
在sql server 2000中只能用一个临时表来解决,生成一个自增列,先对val取最大或最小,然后再通过自增列来取数据。

--

创建表并插入数据:


create

table
tb(name
varchar
(
10
),val
int
,memo
varchar
(
20
))

insert

into
tb
values
(
'
a
'
,   
2
,   
'
a2(a的第二个值)
'
)

insert

into
tb
values
(
'
a
'
,   
1
,   
'
a1--a的第一个值
'
)

insert

into
tb
values
(
'
a
'
,   
1
,   
'
a1--a的第一个值
'
)

insert

into
tb
values
(
'
a
'
,   
3
,   
'
a3:a的第三个值
'
)

insert

into
tb
values
(
'
a
'
,   
3
,   
'
a3:a的第三个值
'
)

insert

into
tb
values
(
'
b
'
,   
1
,   
'
b1--b的第一个值
'
)

insert

into
tb
values
(
'
b
'
,   
3
,   
'
b3:b的第三个值
'
)

insert

into
tb
values
(
'
b
'
,   
2
,   
'
b2b2b2b2
'
)

insert

into
tb
values
(
'
b
'
,   
4
,   
'
b4b4
'
)

insert

into
tb
values
(
'
b
'
,   
5
,   
'
b5b5b5b5b5
'
)

go


select

*
, px
=

identity
(
int
,
1
,
1
)
into
tmp
from
tb

select
m.name,m.val,m.memo
from

(

select
t.
*

from
tmp t
where
val
=
(
select

min
(val)
from
tmp
where
name
=
t.name)
) m

where
px
=
(
select

min
(px)
from

(

select
t.
*

from
tmp t
where
val
=
(
select

min
(val)
from
tmp
where
name
=
t.name)
) n

where
n.name
=
m.name)

drop

table
tb,tmp

/*

name       val         memo
---------- ----------- --------------------
a          1           a1--a的第一个值
b          1           b1--b的第一个值
(2 行受影响)

*/


--
在sql server 2005中可以使用row_number函数,不需要使用临时表。

--

创建表并插入数据:


create

table
tb(name
varchar
(
10
),val
int
,memo
varchar
(
20
))

insert

into
tb
values
(
'
a
'
,   
2
,   
'
a2(a的第二个值)
'
)

insert

into
tb
values
(
'
a
'
,   
1
,   
'
a1--a的第一个值
'
)

insert

into
tb
values
(
'
a
'
,   
1
,   
'
a1--a的第一个值
'
)

insert

into
tb
values
(
'
a
'
,   
3
,   
'
a3:a的第三个值
'
)

insert

into
tb
values
(
'
a
'
,   
3
,   
'
a3:a的第三个值
'
)

insert

into
tb
values
(
'
b
'
,   
1
,   
'
b1--b的第一个值
'
)

insert

into
tb
values
(
'
b
'
,   
3
,   
'
b3:b的第三个值
'
)

insert

into
tb
values
(
'
b
'
,   
2
,   
'
b2b2b2b2
'
)

insert

into
tb
values
(
'
b
'
,   
4
,   
'
b4b4
'
)

insert

into
tb
values
(
'
b
'
,   
5
,   
'
b5b5b5b5b5
'
)

go


select
m.name,m.val,m.memo
from

(

select

*
, px
=
row_number()
over
(
order

by
name , val)
from
tb
) m

where
px
=
(
select

min
(px)
from

(

select

*
, px
=
row_number()
over
(
order

by
name , val)
from
tb
) n

where
n.name
=
m.name)

drop

table
tb

/*

name       val         memo
---------- ----------- --------------------
a          1           a1--a的第一个值
b          1           b1--b的第一个值
(2 行受影响)

*/








引http://znsw.blog.hexun.com/22802673_d.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-296670-1-1.html 上篇帖子: ArcGIS Server(详细介绍)转 下篇帖子: SQL Server中TempDB管理(版本存储区的一个example)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表