一个有点意思的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语句)
...全文
148 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
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)

比较怪异的写法。

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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