求助:关于使用聚合函数Max的问题

jskenson 2008-06-13 04:20:55
两个表:
主表:m
id time1 .......
-----------------------------------------
1 2008-06-01 00:00:00.000
2 2008-06-02 00:00:00.000
3 2008-06-03 00:00:00.000
4 2008-06-04 00:00:00.000
副表:d
id time1 price .............
-----------------------------------------------
1 2008-05-01 00:00:00.000 1
1 2008-05-02 00:00:00.000 2
1 2008-06-03 00:00:00.000 3
2 2008-05-03 00:00:00.000 4
4 2008-05-03 00:00:00.000 5
4 2008-05-01 00:00:00.000 6
要实现在查询如下:
select d.id,max(d.time1) from d,m where d.time1<m.time1 and m.id=d.id group by d.id
我的问题是两个表各有很多其它字段,要在结果中全部体现,求一个比较好的查询方式,谢谢!
(聚合函数如Max\Min可以怎么样用作行定位吗?)
...全文
127 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jskenson 2008-06-13
  • 打赏
  • 举报
回复
6楼有点不对,还有一个条件没有注意到:
副表取的时间条件是:小于主表时间的最大时间(同一ID内)
octwind 2008-06-13
  • 打赏
  • 举报
回复
select * from m inner join (select * from b b1 where not exists(select 1 from b where id=b1.id and time1>b1.time1)) t
on m.id=t.id
或者
select * from m inner join (select * from b b1 where b1.id=(select top 1 id from b where id=b1.id order by time1 desc)) t
on m.id=t.id
jskenson 2008-06-13
  • 打赏
  • 举报
回复
2楼高明啊!
以自己为条件?好像不是很好理解
消化一下先。。。
灰太狼 2008-06-13
  • 打赏
  • 举报
回复
似乎没有办法,只能把列都写上,然后都group by
jskenson 2008-06-13
  • 打赏
  • 举报
回复
楼上的理解错了,我有用到group by,第二个表相同ID下只取日期最大的那一条
中国风 2008-06-13
  • 打赏
  • 举报
回复
--取大小值
/******************************************************************************************************************************************************
Name相同ID最小或最大的记录

整理人:中国风(Roy)

日期:2008.06.06
******************************************************************************************************************************************************/

--> --> (Roy)生成測試數據

if not object_id('Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))
Insert #T
select 1,N'A',N'A1' union all
select 2,N'A',N'A2' union all
select 3,N'A',N'A3' union all
select 4,N'B',N'B1' union all
select 5,N'B',N'B2'
Go


--1、Name相同ID最小的记录(推荐用1,2,3),方法3在SQl05时,效率高于1、2
方法1:
Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID<a.ID)

方法2:
select a.* from #T a join (select min(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID

方法3:
select * from #T a where ID=(select min(ID) from #T where Name=a.Name)

方法4:
select a.* from #T a join #T b on a.Name=b.Name and a.ID>=b.ID group by a.ID,a.Name,a.Memo having count(1)=1

方法5:
select * from #T a group by ID,Name,Memo having ID=(select min(ID)from #T where Name=a.Name)

方法6:
select * from #T a where (select count(1) from #T where Name=a.Name and ID<a.ID)=0

方法7:
select * from #T a where ID=(select top 1 ID from #T where Name=a.name order by ID)

方法8:
select * from #T a where ID!>all(select ID from #T where Name=a.Name)

方法9:
select * from #T a where ID in(select min(ID) from #T group by Name)

--SQL2005:

方法10:
select ID,Name,Memo from (select *,min(ID)over(partition by Name) as MinID from #T a)T where ID=MinID


生成结果:
/*
ID Name Memo
----------- ---- ----
1 A A1
4 B B1

(2 行受影响)
*/


--2、Name相同ID最大的记录,与min相反:
方法1:
Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID>a.ID)

方法2:
select a.* from #T a join (select max(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID order by ID

方法3:
select * from #T a where ID=(select max(ID) from #T where Name=a.Name) order by ID

方法4:
select a.* from #T a join #T b on a.Name=b.Name and a.ID<=b.ID group by a.ID,a.Name,a.Memo having count(1)=1

方法5:
select * from #T a group by ID,Name,Memo having ID=(select max(ID)from #T where Name=a.Name)

方法6:
select * from #T a where (select count(1) from #T where Name=a.Name and ID>a.ID)=0

方法7:
select * from #T a where ID=(select top 1 ID from #T where Name=a.name order by ID desc)

方法8:
select * from #T a where ID!<all(select ID from #T where Name=a.Name)

方法9:
select * from #T a where ID in(select max(ID) from #T group by Name)

--SQL2005:

方法10:
select ID,Name,Memo from (select *,max(ID)over(partition by Name) as MinID from #T a)T where ID=MinID

生成结果2:
/*
ID Name Memo
----------- ---- ----
3 A A3
5 B B2

(2 行受影响)
*/

yrwx001 2008-06-13
  • 打赏
  • 举报
回复
--怕列舉很多列名?
select * from m,(select top 1 * from d where d.time1 < m.time1 and d.id = m.id order by d.time1 desc)A
where A.id = mi.d

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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