SQL Server 按某一字段分组 取 最大 (小)值所在行的数据
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
select
a. *
from
tb a
where
val = (
select
max
(val)
from
tb
where
name
= a.
name
)
order
by
a.
name
select
a. *
from
tb a
where
not
exists (
select
1
from
tb
where
name
= a.
name
and
val > a.val)
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
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
select
a. *
from
tb a
where
1 > (
select
count
( * )
from
tb
where
name
= a.
name
and
val > a.val )
order
by
a.
name
select
a. *
from
tb a
where
val = (
select
min
(val)
from
tb
where
name
= a.
name
)
order
by
a.
name
select
a. *
from
tb a
where
not
exists (
select
1
from
tb
where
name
= a.
name
and
val < a.val)
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
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
select
a. *
from
tb a
where
1 > (
select
count
( * )
from
tb
where
name
= a.
name
and
val < a.val)
order
by
a.
name
select
a. *
from
tb a
where
val = (
select
top
1 val
from
tb
where
name
= a.
name
)
order
by
a.
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
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