一个有点意思的SQL语句的写法,求工资的

laohan8849 2004-09-07 10:07:51

姓名(name) 工资余额(balance) date_time(日期)

a 30 2004-08-09
a 10 2004-09-10
a 5 2004-09-11
b 50 2004-08-01
b 5 2004-09-11
c 5 2004-09-11

我想得到每个人工资余额最新的数据(日期最新的)

日期为字符串型

也就是想得这样的数据

a 5 2004-09-11
b 5 2004-09-11
c 5 2004-09-11

用什么方法可以实现啊(用一条SQl语句)
...全文
113 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yjdn 2004-09-08
建表:
create table tn
(
name varchar2(10),
balance int,
date_time varchar2(50))

输入数据
insert into tn values('a', 30,'2004-08-09');
insert into tn values('a',10,'2004-09-10');
insert into tn values('a',5,'2004-09-11') ;
insert into tn values('b',50,'2004-08-01');
insert into tn values('b',5,'2004-09-11' ) ;
insert into tn values('c', 5 ,'2004-09-11') ;

测试:
select * from tn where date_time in (select max(date_time) from tn group by name)

结果:
NAME BALANCE DATE_TIME
---------- ---------- --------------------------------------------------
a 5 2004-09-11
b 5 2004-09-11
c 5 2004-09-11
回复
yjdn 2004-09-08
dejkstro(立刻死臭)
SQL> select tn.* from tn ,(select name,max(date_time) date_time from tn group by name) max_tn
2 where tn.name = max_tn.name and tn.date_time = max_tn.date_time
-------------------------
不错
回复
yjdn 2004-09-08
汗,麻烦下次给一个有代表性的表
回复
laohan8849 2004-09-08
dejkstro(立刻死臭)的答案是对的。。。
yjdn(无尽天空) 是我第一次用的方法。。。结果会出现重得的记录


回复
dejkstro 2004-09-08
改成这样则ok:

SQL> select tn.* from tn ,(select name,max(date_time) date_time from tn group by name) max_tn
2 where tn.name = max_tn.name and tn.date_time = max_tn.date_time
3 ;

NAME BALANCE DATE_TIME
---------- --------------------------------------- ------------------------
a 5 2004-09-11
b 5 2004-09-11
c 8 2004-09-12
回复
dejkstro 2004-09-08
我有测试了一下 yjdn(无尽天空) 的会出现不是最后最后日期的记录!
建表:
create table tn
(
name varchar2(10),
balance int,
date_time varchar2(50))

输入数据
insert into tn values('a', 30,'2004-08-09');
insert into tn values('a',10,'2004-09-10');
insert into tn values('a',5,'2004-09-11') ;
insert into tn values('b',50,'2004-08-01');
insert into tn values('b',5,'2004-09-11' ) ;
insert into tn values('c', 5 ,'2004-09-11') ;
insert into tn values('c', 8 ,'2004-09-12') ;

SQL> select * from tn where date_time in (select max(date_time) from tn group by name);

NAME BALANCE DATE_TIME
---------- --------------------------------------- -----------------------
a 5 2004-09-11
b 5 2004-09-11
c 5 2004-09-11
c 8 2004-09-12

这样c就出现了两次!



回复
lijins 2004-09-08
好,学了一招!
顶之……
回复
dejkstro 2004-09-08
yjdn(无尽天空) 的方法简洁明了。支持。
回复
laohan8849 2004-09-07
不行吧。。。结果不对啊
回复
zhouweiwansui 2004-09-07
如果关键字是name和date_time,可以这样:

select name,balance from table
where name||to_char(date_time,'yyyy-mm-dd') in (
select name||to_char(max(date_time),'yyyy-mm-dd') from table
group by name)

比较怪异的写法。
回复
相关推荐
发帖
基础和管理
创建于2007-09-28

1.7w+

社区成员

Oracle 基础和管理
申请成为版主
帖子事件
创建了帖子
2004-09-07 10:07
社区公告
暂无公告