首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL复杂查询,百思不得其解

2013-07-09 
【求助】SQL复杂查询,百思不得其解建表SQL:CREATE TABLE [dbo].[t_user]([id] [nchar](10) NOT NULL,[name]

【求助】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)

热点排行