读书人

SQL复杂查询百思不得其解

发布时间: 2013-07-09 09:50:47 作者: rapoo

【求助】SQL复杂查询,百思不得其解
建表SQL:


CREATE TABLE [dbo].[t_user](
[id] [nchar](10) NOT NULL,
[name] [nchar](10) NOT NULL,
[money] [int] NOT NULL,
[time] [datetime] NOT NULL,
CONSTRAINT [PK_t_user] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[t_user] ADD CONSTRAINT [DF_t_user_time] DEFAULT (getdate()) FOR [time]
GO


数据:

id name moneytime
1 zhangsan 1002013-03-04 16:45:55.760
2 lisi 1102013-03-04 16:46:09.917
3 wangwu 1202013-04-04 16:56:42.343
4 zhangsan 802013-05-04 16:56:54.123
5 zhangsan 2632013-06-04 16:57:02.230
6 lisi 642013-06-04 16:57:11.950
7 wangwu 2652013-07-04 16:57:21.850
8 lisi 2642013-07-04 16:57:32.730


问题:
需要按照【name】查询每个人最近一次的消费记录,每个人一条记录,结果应如下:

id name moneytime
5 zhangsan 2632013-06-04 16:57:02.230
7 wangwu 2652013-07-04 16:57:21.850
8 lisi 2642013-07-04 16:57:32.730


SQL学的很烂,求助各位,帮忙解决!谢谢!
SQL疑难问题


[解决办法]
;with tmp
as(select *,rn=row_number()over(partition by name order by time desc) from t_user)
select * from tmp
where rn=1
[解决办法]

引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

;with tmp
as(select *,rn=row_number()over(partition by name order by time desc) from t_user)
select * from tmp
where rn=1

谢谢!能够正常获取,至于语法还在研究,话说partition by见都没见过。。。
再次谢谢wufeng4552,速度好快!



--SQL SERVER 2000 可以这样:
--> 测试数据:@T
declare @T table([id] int,[name] varchar(8),[money] int,[time] datetime)
insert @T
select 1,'zhangsan',100,'2013-03-04 16:45:55.760' union all
select 2,'lisi',110,'2013-03-04 16:46:09.917' union all
select 3,'wangwu',120,'2013-04-04 16:56:42.343' union all
select 4,'zhangsan',80,'2013-05-04 16:56:54.123' union all
select 5,'zhangsan',263,'2013-06-04 16:57:02.230' union all
select 6,'lisi',64,'2013-06-04 16:57:11.950' union all
select 7,'wangwu',265,'2013-07-04 16:57:21.850' union all
select 8,'lisi',264,'2013-07-04 16:57:32.730'

select * from @T t
where [time]=(select max([time]) from @T where name=t.name)

/*
id name money time
----------- -------- ----------- -----------------------
5 zhangsan 263 2013-06-04 16:57:02.230
7 wangwu 265 2013-07-04 16:57:21.850
8 lisi 264 2013-07-04 16:57:32.730


*/


谢谢回复!问题同qy1116,如果有时间一样的,就会多出一条,谢谢。



select * from @T t
where id=(select top 1 id from @T where name=t.name order by [time] desc)


这样就不多了,信不信?

是的不多了,但是少了很多:

select * from t_user where id=(select top 1 id from t_user where name=t_user.name order by [time] desc)

结果:

idnamemoneytime
8 lisi 2642013-07-04 16:57:32.730


你把我的改了,是这样的:

select * from t_user t
where id=(select top 1 id from t_user where name=t.name order by [time] desc)

[解决办法]
引用:
Quote: 引用:

select *  from [t_user]
where time in (select max(time) from [t_user]
group by name )

这个可以,不过如果时间相同,比如如下数据:

id name moneytime
1 zhangsan 1002013-03-04 16:45:55.760
2 lisi 1102013-03-04 16:46:09.917
3 wangwu 1202013-04-04 16:56:42.343
4 zhangsan 802013-05-04 16:56:54.123
5 zhangsan 2632013-06-04 16:57:02.230
6 lisi 642013-06-04 16:57:11.950
7 wangwu 2652013-07-04 16:57:21.850
8 lisi 2642013-07-04 16:57:32.730
9 lisi 2412013-07-04 16:57:32.730

使用

select * from [t_user]
where time in (select max(time) from [t_user]
group by name )



得到的结果如下:

id name moneytime
5 zhangsan 2632013-06-04 16:57:02.230
7 wangwu 2652013-07-04 16:57:21.850
8 lisi 2642013-07-04 16:57:32.730
9 lisi 2412013-07-04 16:57:32.730

不过,谢谢回复!
谢谢提醒!!害我下班没走还杀死了多少细胞又想到一个方法。。。还有最近消费记录一般是不会出现重复的时间吧,lz考虑的多了哦 嘿嘿
select * from  [t_user]
where id in(
select MAX(id) from [t_user]
where time in (select max(time) from [t_user]
group by name
)
group by name)

读书人网 >SQL Server

热点推荐