高分求一个SQL 查询语句

例如表里的字段有:ID,企业帐号,信息内容,更新时间现在每个企业帐号下有几十条信息,我想用一条语句查询出的结果里一个企业帐号最多显示5条信息,并且以更新时间倒续,想了好久... 例如表里的字段有: ID,企业帐号,信息内容,更新时间
现在每个企业帐号下有几十条信息,我想用一条语句查询出的结果里一个企业帐号最多显示5条信息,并且以更新时间倒续,想了好久想不出怎么写这语句
以下的回答都无法实现.
我要的查询结果是显示出所有企业的最新5条数据
声明:本人用的是SQL2000
展开
 我来答
學有止境
2009-10-27 · TA获得超过194个赞
知道答主
回答量:143
采纳率:0%
帮助的人:0
展开全部
select ID,企业帐号,信息内容,更新时间
from(
select ID,企业帐号,信息内容,更新时间,row_number()over(partition by 企业帐号 order by 更新时间 desc) id
from 表名) tmp
where id <= 5

奔驰M888

----------------------------------------------
这一条要把row_number()改成rank()就对了

select ID,企业帐号,信息内容,更新时间
from(
select ID,企业帐号,信息内容,更新时间,rank()over(partition by 企业帐号 order by 更新时间 desc) id
from 表名) tmp
where id <= 5
a5202003
2009-10-23 · TA获得超过2250个赞
知道大有可为答主
回答量:1885
采纳率:75%
帮助的人:597万
展开全部
declare @AC varchar(50),@i int,@CmdText
declare d cursor fast_forward for select 企业账号 from 表 group by 企业账号
open d
fetch next from d into @AC
while @@fetch_status=0
begin
set @CmdText=@CmdText+char(13)+'select top 5 * from 表 where 企业账号='''+@AC+' order by 更新时间 desc union'
fetch next from d into @AC
end
close d
deallocate d

exec sp_executesql left(@CmdText,len(@CmdText)-6)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
geto1080
2009-10-23 · TA获得超过320个赞
知道小有建树答主
回答量:1359
采纳率:100%
帮助的人:531万
展开全部
--需要使用游标cursor,你上面说的问题不是很清楚,下面的是一个例子:
--企业是一张表Employees,另一张表EmployeeInfo存储企业帐号的信息。
--希望对你有帮助。
DECLARE Employee_Cursor CURSOR FOR select ID from Employees

declare @id int

OPEN Employee_Cursor
FETCH NEXT FROM
Employee_Cursor into @id
WHILE @@FETCH_STATUS = 0
BEGIN

select top 5 * from EmployeeInfo where id = @id

FETCH NEXT FROM Employee_Cursor into @id
END
CLOSE Employee_Cursor
deallocate Employee_Cursor
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
奔驰M888
2009-10-25 · TA获得超过1.1万个赞
知道大有可为答主
回答量:1846
采纳率:0%
帮助的人:2716万
展开全部
*********************************************
SqlServer2005以上版本(含2005)和 oracle
*********************************************

select ID,企业帐号,信息内容,更新时间
from(
select ID,企业帐号,信息内容,更新时间,row_number()over(partition by 企业帐号 order by 更新时间 desc) id
from 表名) tmp
where id <= 5;

*********************************************
其他的数据库,当然上面的数据库也是可以的
*********************************************
select ID,企业帐号,信息内容,更新时间 from
(
select ID,
企业帐号,
信息内容,
更新时间,
(select count(1) from (select * from 表名 更新时间 desc) b where b.ID<=a.ID and b.企业帐号 = a.企业帐号) rum
from (select * from 表名 order by 更新时间 desc) a
) tmp
where rum <= 5;

---
以上,希望对你有所帮助。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
带我信乐
2009-10-23 · TA获得超过1353个赞
知道小有建树答主
回答量:680
采纳率:0%
帮助的人:721万
展开全部
LZ 是要每个企业都需显示5条,以下是SQLSERVER 写法能到达要求
--生成公司信息
CREATE TABLE Test_Company
(
FCompanyID int primary key identity(1,1),
FCompanyName nvarchar(300),
FCreateDate smalldatetime default( CONVERT(CHAR(10),Getdate(),121)) null
)
INSERT INTO Test_Company (FCompanyName)
SELECT '张三有限公司'
UNION ALL
SELECT '李四有限公司'
UNION ALL
SELECT '王五有限公司'
UNION ALL
SELECT '麻子有限公司'
--生成公司发布信息
CREATE TABLE Test_CompanyNews
(
FCompanyNewsID int primary key identity(1,1),
FCompanyID int constraint aaa foreign key (FCompanyID) references Test_Company(FCompanyID),
FNews nvarchar(4000),
FCreateDate datetime,
)
测试数据都不能写了 郁闷,数据库板块已到达修改次数限制 纳闷
--王五公司未有新闻,李四新闻未足5条,张三与麻子多于5条
INSERT INTO Test_CompanyNews(FCompanyID,FNews,FCreateDate)
SELECT 1,'张三公司AAAAA','2009-01-01'
UNION ALL
XXXXXXXXXXXXXXXXXXXXX
UNION ALL
SELECT 1,'张三公司HHHHH','2009-09-01'
UNION ALL
SELECT 2,'李四公司AAAAA','2009-01-01'
UNION ALL
SELECT 2,'李四公司BBBBB','2009-04-01'
UNION ALL
SELECT 4,'麻子公司AAAAA','2009-01-01'
UNION ALL
XXXXXXXXXXXXXXXXXXXXXXXXXX
UNION ALL
SELECT 4,'麻子公司GGGGG','2009-09-01'
最后就这样写
SELECT *
FROM Test_CompanyNews AS TA
WHERE FCompanyNewsID IN
(
SELECT top 5 FCompanyNewsID
FROM Test_CompanyNews AS TB
WHERE TA.FCompanyID = TB.FCompanyID
ORDER BY FCreateDate DESC
)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
abill425
2009-10-24 · TA获得超过1726个赞
知道小有建树答主
回答量:663
采纳率:100%
帮助的人:1088万
展开全部
三楼的,人家问的是“用一条语句”,我都想了一个小时了,还没想出来呢,要是用游标,那不太简单了?值100分吗?
楼主别急,我好好想想,应该有办法的。只是估计sql会很长。。。
-----------------------------------------------------------
终于搞定,思路是:

每个企业的最大更新日期的信息
加上
每个企业的第二大更新日期的信息
加上
每个企业的第三大更新日期的信息
加上
每个企业的第四大更新日期的信息
加上
每个企业的第五大更新日期的信息

把这些信息过滤掉更新日期为空的,然后按"企业,更新日期 desc "的顺序检索出来。

实现的Tsql语句是(注意,有点长,但这是一个单独的语句,请按照我给的思路来看):

select 企业账号,更新时间,(select 信息内容 from 表名 where 更新时间=b.更新时间 and 企业账号=b.企业账号) as 信息内容 from

(select 企业账号,(select max(更新时间) from 表名 where 企业账号=a.企业账号) as 更新时间
from (select distinct 企业账号 from 表名) a

union all

select 企业账号,(select max(更新时间) from 表名 where 企业账号=a.企业账号 and 更新时间<(select max(更新时间) from 表名 where 企业账号=a.企业账号)) as 更新时间
from (select distinct 企业账号 from 表名) a

union all

select 企业账号,(select max(更新时间) from 表名 where 企业账号=a.企业账号 and 更新时间<(select max(更新时间) from 表名 where 企业账号=a.企业账号 and 更新时间<(select max(更新时间) from 表名 where 企业账号=a.企业账号))) as 更新时间
from (select distinct 企业账号 from 表名) a

union all

select 企业账号,(select max(更新时间) from 表名 where 企业账号=a.企业账号 and 更新时间<(select max(更新时间) from 表名 where 企业账号=a.企业账号 and 更新时间<(select max(更新时间) from 表名 where 企业账号=a.企业账号 and 更新时间<(select max(更新时间) from 表名 where 企业账号=a.企业账号)))) as 更新时间
from (select distinct 企业账号 from 表名) a

union all

select 企业账号,(select max(更新时间) from 表名 where 企业账号=a.企业账号 and 更新时间<(select max(更新时间) from 表名 where 企业账号=a.企业账号 and 更新时间<(select max(更新时间) from 表名 where 企业账号=a.企业账号 and 更新时间<(select max(更新时间) from 表名 where 企业账号=a.企业账号 and 更新时间<(select max(更新时间) from 表名 where 企业账号=a.企业账号))))) as 更新时间
from (select distinct 企业账号 from 表名) a) b

where 更新时间 is not null and 更新时间>'1900-01-01'
order by 企业账号,更新时间 desc

开始也想过查出“比每个企业的第五大更新日期大的信息”即可,可是后来发现,如果企业的信息不足5个,将无法查出正确的结果。

楼主可以自行替换sql中的表名和字段名,查询一下,看能不能得出正确的结果。

另外:使用游标的同志们请认真审一下楼主的题目,要求是“一条sql语句”。而"v沛v"同志请检查一下你的sql,select部分中“更新时间,ID,信息内容”三个字段没有在Group部分出现,也没有出现在聚合函数中,这样的sql是不正确的。"带我信乐"同志,楼主说的是只一个表,不是两个表。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(7)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式