一个小小的问题请教大家,谢谢啦!!!!!!!!!!!!!!!

little_ant2 2009-10-27 05:49:24
有下面一个表,c是日期字段
a b c d
A 09-09-01 WRYR ART
A 09-06-05 GHS GHSR
A 09-04-03 ATA SH
A 09-05-04 ATA SHGS
A 09-01-05 PFJAO AT
V 09-10-20 SFS AA
V 09-06-10 QQQQ GJH
V 09-04-03 SG AAG
V 09-05-04 GHSA GG
V 09-01-05 HDG HH
.........................

如何选出a列下每个字段出现最近日期的一条数据,比如在a列 字段为A情况下
a b c d
A 09-09-01 WRYR ART
A 09-06-05 GHS GHSR
A 09-04-03 ATA SH
A 09-05-04 ATA SHGS
A 09-01-05 PFJAO AT

b列最早的日期是09-09-01,然后就是选出这一列数据,

a b c d
A 09-09-01 WRYR ART



下面的取数同样,最后整个表能取到的数如下
a b c d
A 09-09-01 WRYR ART
V 09-10-20 SFS AA
.....

该如何取 请教大家 谢谢。。。。。。。。。。。。。


...全文
91 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
little_ant2 2009-10-27
  • 打赏
  • 举报
回复
哇塞 好感动 这么多答案 我赶紧验证下 谢谢大虾。。。。。。
dawugui 2009-10-27
  • 打赏
  • 举报
回复
create table tb(a varchar(10),b datetime,c varchar(10),d varchar(10))
insert into tb values('A' ,'09-09-01', 'WRYR ', 'ART')
insert into tb values('A' ,'09-06-05', 'GHS ', 'GHSR')
insert into tb values('A' ,'09-04-03', 'ATA ', 'SH')
insert into tb values('A' ,'09-05-04', 'ATA ', 'SHGS')
insert into tb values('A' ,'09-01-05', 'PFJAO', 'AT')
insert into tb values('V' ,'09-10-20', 'SFS ', 'AA')
insert into tb values('V' ,'09-06-10', 'QQQQ ', 'GJH')
insert into tb values('V' ,'09-04-03', 'SG ', 'AAG')
insert into tb values('V' ,'09-05-04', 'GHSA ', 'GG')
insert into tb values('V' ,'09-01-05', 'HDG ', 'HH')
go
--方法1
select t.* from tb t where b = (select max(b) from tb where a = t.a) order by t.a
/*
a b c d
---------- ------------------------------------------------------ ---------- ----------
A 2009-09-01 00:00:00.000 WRYR ART
V 2009-10-20 00:00:00.000 SFS AA

(所影响的行数为 2 行)
*/

--方法2
select t.* from tb t where not exists (select 1 from tb where a = t.a and b > t.b) order by t.a
/*
a b c d
---------- ------------------------------------------------------ ---------- ----------
A 2009-09-01 00:00:00.000 WRYR ART
V 2009-10-20 00:00:00.000 SFS AA

(所影响的行数为 2 行)
*/
drop table tb


其他相关内容见下:


--按某一字段分组取最大(小)值所在行的数据
--(爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 2007-10-23于浙江杭州)
/*
数据如下:
name val memo
a 2 a2(a的第二个值)
a 1 a1--a的第一个值
a 3 a3:a的第三个值
b 1 b1--b的第一个值
b 3 b3:b的第三个值
b 2 b2b2b2b2
b 4 b4b4
b 5 b5b5b5b5b5
*/
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a', 2, 'a2(a的第二个值)')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('b', 1, 'b1--b的第一个值')
insert into tb values('b', 3, 'b3:b的第三个值')
insert into tb values('b', 2, 'b2b2b2b2')
insert into tb values('b', 4, 'b4b4')
insert into tb values('b', 5, 'b5b5b5b5b5')
go

--一、按name分组取val最大的值所在行的数据。
--方法1:
select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)
--方法3:
select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
--方法5
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name
/*
name val memo
---------- ----------- --------------------
a 3 a3:a的第三个值
b 5 b5b5b5b5b5
*/

--二、按name分组取val最小的值所在行的数据。
--方法1:
select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val)
--方法3:
select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
--方法5
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val < a.val) order by a.name
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 1 b1--b的第一个值
*/

--三、按name分组取第一次出现的行所在的数据。
select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name
/*
name val memo
---------- ----------- --------------------
a 2 a2(a的第二个值)
b 1 b1--b的第一个值
*/

--四、按name分组随机取一条数据。
select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 5 b5b5b5b5b5
*/

--五、按name分组取最小的两个(N个)val
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val < a.val ) order by a.name,a.val
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val
select a.* from tb a where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2) order by a.name,a.val
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
a 2 a2(a的第二个值)
b 1 b1--b的第一个值
b 2 b2b2b2b2
*/

--六、按name分组取最大的两个(N个)val
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val
select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*) < 2) order by a.name , a.val
/*
name val memo
---------- ----------- --------------------
a 2 a2(a的第二个值)
a 3 a3:a的第三个值
b 4 b4b4
b 5 b5b5b5b5b5
*/
--七,如果整行数据有重复,所有的列都相同。
/*
数据如下:
name val memo
a 2 a2(a的第二个值)
a 1 a1--a的第一个值
a 1 a1--a的第一个值
a 3 a3:a的第三个值
a 3 a3:a的第三个值
b 1 b1--b的第一个值
b 3 b3:b的第三个值
b 2 b2b2b2b2
b 4 b4b4
b 5 b5b5b5b5b5
*/
--在sql server 2000中只能用一个临时表来解决,生成一个自增列,先对val取最大或最小,然后再通过自增列来取数据。
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a', 2, 'a2(a的第二个值)')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('b', 1, 'b1--b的第一个值')
insert into tb values('b', 3, 'b3:b的第三个值')
insert into tb values('b', 2, 'b2b2b2b2')
insert into tb values('b', 4, 'b4b4')
insert into tb values('b', 5, 'b5b5b5b5b5')
go

select * , px = identity(int,1,1) into tmp from tb

select m.name,m.val,m.memo from
(
select t.* from tmp t where val = (select min(val) from tmp where name = t.name)
) m where px = (select min(px) from
(
select t.* from tmp t where val = (select min(val) from tmp where name = t.name)
) n where n.name = m.name)

drop table tb,tmp

/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 1 b1--b的第一个值

(2 行受影响)
*/
--在sql server 2005中可以使用row_number函数,不需要使用临时表。
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a', 2, 'a2(a的第二个值)')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('b', 1, 'b1--b的第一个值')
insert into tb values('b', 3, 'b3:b的第三个值')
insert into tb values('b', 2, 'b2b2b2b2')
insert into tb values('b', 4, 'b4b4')
insert into tb values('b', 5, 'b5b5b5b5b5')
go

select m.name,m.val,m.memo from
(
select * , px = row_number() over(order by name , val) from tb
) m where px = (select min(px) from
(
select * , px = row_number() over(order by name , val) from tb
) n where n.name = m.name)

drop table tb

/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 1 b1--b的第一个值

(2 行受影响)
*/
SQL77 2009-10-27
  • 打赏
  • 举报
回复
晕,还整复杂了
SQL77 2009-10-27
  • 打赏
  • 举报
回复

SELECT A,B,C,D FROM #T T WHERE
NOT EXISTS(SELECT 1 FROM TB WHERE A=T.A AND B<T.B)
子陌红尘 2009-10-27
  • 打赏
  • 举报
回复
select t.* from 表 t where not exists(select 1 from 表 where a=t.a and b>t.b)
xman_78tom 2009-10-27
  • 打赏
  • 举报
回复


select * from tab t where not exists (select 1 from tab where a=t.a and b<t.b)

SQL77 2009-10-27
  • 打赏
  • 举报
回复
SELECT IDD=IDENTITY(INT,1,1),* INTO #T FROM TB 
SELECT A,B,C,D FROM #T T WHERE
NOT EXISTS(SELECT 1 FROM TB WHERE B=T.B AND IDD<T.IDD)
dawugui 2009-10-27
  • 打赏
  • 举报
回复
select t.* from tb t where b = (select max(b) from tb where a = t.a)
dawugui 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 little_ant2 的回复:]
有下面一个表,c是日期字段
a b c d
A 09-09-01 WRYR ART
A 09-06-05 GHS GHSR
A 09-04-03 ATA SH
A 09-05-04 ATA SHGS
A 09-01-05 PFJAO AT
V 09-10-20 SFS AA
V 09-06-10 QQQQ GJH
V 09-04-03 SG AAG
V 09-05-04 GHSA GG
V 09-01-05 HDG HH
.........................

如何选出a列下每个字段出现最近日期的一条数据,比如在a列 字段为A情况下
a b c d
A 09-09-01 WRYR ART
A 09-06-05 GHS GHSR
A 09-04-03 ATA SH
A 09-05-04 ATA SHGS
A 09-01-05 PFJAO AT

b列最早的日期是09-09-01,然后就是选出这一列数据,

a b c d
A 09-09-01 WRYR ART


下面的取数同样,最后整个表能取到的数如下
a b c d
A 09-09-01 WRYR ART
V 09-10-20 SFS AA
.....

该如何取  请教大家 谢谢。。。。。。。。。。。。。



[/Quote]
select t.* from c t where b = (select max(b) from c where a = t.a)
little_ant2 2009-10-27
  • 打赏
  • 举报
回复
更正下 b 列是日期
最近在研究如何用 易语言 连接oracle数据库,搜集了网上很多源码和请教了一些人都没能测试成功。 经过不懈努力,我终于测通了!哈哈哈哈~ 不过,我想吐槽的是: 在搜集资料过程中,发现很多人都说易语言很难连上oracle,讲真,我也觉得官方不够给力! oracle作为全球第一大数据库厂商,为什么出易语言的官方支持库来适配呢? 虽然说可以通过调用windows的odbc来连,但这对不懂的人来说是很困难的一件事! 所以,真心希望官方能开发出oracle的支持库!!! 在测试过程中,我总结了以下几个需要注意的点: 1、无论你的电脑是32位还是64位,都必须安装32位的oracle客户端。安装类型可以是:管理员、运行时。 2、从oracle 11g以后,oracle官方不再提供32位的客户端安装介质。目前最新的oracle客户端为win32_11gR2_client.zip,可直接从官网下载。 3、选择DRIVER连接时,需要先在$ORACLE_HOME/network/admin/tnsnames.ora文件中的定义的一个连接名,测试成功后再将连接名配置在SERVER(连接服务名)中。 4、选择DSN连接时,需要先在OS系统数据源(32位)中配置好数据源,测试成功后再将数据源名称配置在DSN(数据源)中。 只要你按照以上几点来,就肯定可以用易语言连接oracle,并执行简单查询。 我自己的测试代码已分享出来了,需要oracle客户端的朋友可以去官方下载,也可以私信我。 好了,第一次参加这么盛大的活动,小小意思,请各位看官指点,谢谢

34,588

社区成员

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

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