取出数据

liyouli_love_22 2008-06-11 09:43:13
PerformanaccessID empID manID MakingDate
1 117 113 2008-5-10 8:57:30
1 117 24 2008-5-11 9:57:30

SQL语句:
select distinct EmpID,manID from KhTbwDoingPerAccessRecord where 1=1 and MarkingDate between '06 1 2008 12:00AM' and '06 30 2008 12:00AM' AND EmpID= 117 group by EmpID,manID
结果:
empID manID
117 24
117 113

现在我要取出一个manID(MakingDate大一点的),该怎么做?
...全文
129 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyouli_love_22 2008-06-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xiaogang107 的回复:]
引用楼主 liyouli_love_22 的帖子:
PerformanaccessID empID manID MakingDate
1 117 113 2008-5-10 8:57:30
1 117 24 2008-5-11 9:57:30

SQL语句:
select distinct EmpID,max(manID) from KhTbwDoingPerAccessRecord where 1=1 and MarkingDate between '06 1 2008 12:00AM' and '06 30 2008 12:00AM' AND EmpID= 117 group by EmpID,manID
结果:
empID ma…
[/Quote]

empID、manID代表的是两个人,不可以用max()函数的
conan304 2008-06-11
  • 打赏
  • 举报
回复
转SQL版龟帖:
--按某一字段分组取最大(小)值所在行的数据
(爱新觉罗.毓华 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 行受影响)
*/
conan304 2008-06-11
  • 打赏
  • 举报
回复
--如果要考虑empid=118,但是时间范围在5.1-.31之间的数据,也就是说118应该
--选择118,110的数据,则要用临时表,可能还有更好的方法,等高人

declare @t table(performanaccessID int,empid int,manid int,MarkingDate datetime)
insert @t select 1,117,113,'2008-5-10 8:57:30'
union all select 1,117,24,'2008-5-11 9:57:30'
union all select 1,116,113,'2008-5-11 9:57:31'
union all select 1,116,112,'2008-5-10 8:57:30'
union all select 1,118,110,'2008-5-10 8:57:30'
union all select 1,118,111,'2008-6-10 8:57:30'


select * from @t

select * into #
from @t
where MarkingDate between '05 1 2008 12:00AM' and '05 30 2008 12:00AM'

select empid,manID
from # k
where MarkingDate=(select max(MarkingDate) from # where k.empid=empid)
order by 1

drop table
/*
所影响的行数为 6 行)

performanaccessID empid manid MarkingDate
----------------- ----------- ----------- ------------------------
1 117 113 2008-05-10 08:57:30.000
1 117 24 2008-05-11 09:57:30.000
1 116 113 2008-05-11 09:57:31.000
1 116 112 2008-05-10 08:57:30.000
1 118 110 2008-05-10 08:57:30.000
1 118 111 2008-06-10 08:57:30.000

(所影响的行数为 6 行)


(所影响的行数为 5 行)

empid manID
----------- -----------
116 113
117 24
118 110

(所影响的行数为 3 行)

*/
conan304 2008-06-11
  • 打赏
  • 举报
回复
或者(Sorry,六楼没写好):
select empid,manID
from @t k
where MarkingDate between '05 1 2008 12:00AM' and '05 30 2008 12:00AM'
and not exists(select 1 from @t where MarkingDate>k.MarkingDate and k.empid=empid)
/*
empid manID
----------- -----------
117 24
116 113
118 110

(所影响的行数为 3 行)
*/
conan304 2008-06-11
  • 打赏
  • 举报
回复
declare @t table(performanaccessID int,empid int,manid int,MarkingDate datetime)
insert @t select 1,117,113,'2008-5-10 8:57:30'
union all select 1,117,24,'2008-5-11 9:57:30'
union all select 1,116,113,'2008-5-11 9:57:31'
union all select 1,116,112,'2008-5-10 8:57:30'
union all select 1,118,110,'2008-5-10 8:57:30'


select * from @t

select empid,manID
from @t k
where MarkingDate between '05 1 2008 12:00AM' and '05 30 2008 12:00AM'
and MarkingDate=(select max(MarkingDate) from @t where k.empid=empid)

/*
所影响的行数为 5 行)

performanaccessID empid manid MarkingDate
----------------- ----------- ----------- ------------------------
1 117 113 2008-05-10 08:57:30.000
1 117 24 2008-05-11 09:57:30.000
1 116 113 2008-05-11 09:57:31.000
1 116 112 2008-05-10 08:57:30.000
1 118 110 2008-05-10 08:57:30.000

(所影响的行数为 5 行)

empid manID
----------- -----------
117 24
116 113
118 110

(所影响的行数为 3 行)

*/
大自然D使者 2008-06-11
  • 打赏
  • 举报
回复
如果不行,那么提示什么错误呢?
大自然D使者 2008-06-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 liyouli_love_22 的帖子:]
PerformanaccessID empID manID MakingDate
1 117 113 2008-5-10 8:57:30
1 117 24 2008-5-11 9:57:30

SQL语句:
select distinct EmpID,max(manID) from KhTbwDoingPerAccessRecord where 1=1 and MarkingDate between '06 1 2008 12:00AM' and '06 30 2008 12:00AM' AND EmpID= 117 group by EmpID,manID
结果:
empID manID
117 24
117 113

现在我要…
[/Quote]
楼主试一下这样看这样可不可以。
liyouli_love_22 2008-06-11
  • 打赏
  • 举报
回复
客户的需要阿
confei 2008-06-11
  • 打赏
  • 举报
回复
实在不理解LZ为啥把逻辑简单的东东写的这么复杂。
liyouli_love_22 2008-06-11
  • 打赏
  • 举报
回复
不行啊
小明aa 2008-06-11
  • 打赏
  • 举报
回复
select EmpID,max(manID) as manID from KhTbwDoingPerAccessRecord where 1=1 and MarkingDate between '06 1 2008 12:00AM' and '06 30 2008 12:00AM' AND EmpID= 117 group by EmpID,manID
liyouli_love_22 2008-06-11
  • 打赏
  • 举报
回复
PerformanaccessID empID manID MakingDate
1 117 113 2008-5-10 8:57:30
1 117 24 2008-5-11 9:57:30
1 116 113 2008-5-11 9:57:31

当我在没有指定EmpID=117的时候,要把 116、117同时显示出来。怎么做呢?
即:
select distinct EmpID,manID from KhTbwDoingPerAccessRecord where 1=1 group by EmpID,manID
要得到的结果:
empID manID
117 24
116 113
conan304 2008-06-11
  • 打赏
  • 举报
回复
select empid,manID
from KhTbwDoingPerAccessRecord k
where MarkingDate between '06 1 2008 12:00AM' and '06 30 2008 12:00AM'
and not exists(select 1 from KhTbwDoingPerAccessRecord where MarkingDate<k.MarkingDate)
conan304 2008-06-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 liyouli_love_22 的帖子:]
PerformanaccessID empID manID MakingDate
1 117 113 2008-5-10 8:57:30
1 117 24 2008-5-11 9:57:30

SQL语句:
select distinct EmpID,manID from KhTbwDoingPerAccessRecord where 1=1 and MarkingDate between '06 1 2008 12:00AM' and '06 30 2008 12:00AM' AND EmpID= 117 group by EmpID,manID
结果:
empID manID
117 24
117 113

现在我要…
[/Quote]

select empid,manID
from KhTbwDoingPerAccessRecord k
where 1=1 and MarkingDate between '06 1 2008 12:00AM' and '06 30 2008 12:00AM'
and not exists(select 1 from KhTbwDoingPerAccessRecord where MarkingDate<k.MarkingDate)
jinjin666 2008-06-11
  • 打赏
  • 举报
回复
select top 1 order by ...;
syc958 2008-06-11
  • 打赏
  • 举报
回复
select top 1 manID from table order by MakingDate desc;
XJQ_1 2008-06-11
  • 打赏
  • 举报
回复
select top 1 EmpID,manID from KhTbwDoingPerAccessRecord where 1=1 and MarkingDate between '06 1 2008 12:00AM' and '06 30 2008 12:00AM' AND EmpID=117
group by EmpID,manID order by manID,MakingDate
一品梅 2008-06-11
  • 打赏
  • 举报
回复
select top 1                    order by ...;

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧