高分求一个SQL 查询语句
例如表里的字段有:ID,企业帐号,信息内容,更新时间现在每个企业帐号下有几十条信息,我想用一条语句查询出的结果里一个企业帐号最多显示5条信息,并且以更新时间倒续,想了好久...
例如表里的字段有: ID,企业帐号,信息内容,更新时间
现在每个企业帐号下有几十条信息,我想用一条语句查询出的结果里一个企业帐号最多显示5条信息,并且以更新时间倒续,想了好久想不出怎么写这语句
以下的回答都无法实现.
我要的查询结果是显示出所有企业的最新5条数据
声明:本人用的是SQL2000 展开
现在每个企业帐号下有几十条信息,我想用一条语句查询出的结果里一个企业帐号最多显示5条信息,并且以更新时间倒续,想了好久想不出怎么写这语句
以下的回答都无法实现.
我要的查询结果是显示出所有企业的最新5条数据
声明:本人用的是SQL2000 展开
9个回答
展开全部
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
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
展开全部
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)
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)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
--需要使用游标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
--企业是一张表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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
*********************************************
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;
---
以上,希望对你有所帮助。
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;
---
以上,希望对你有所帮助。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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
)
--生成公司信息
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
)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
三楼的,人家问的是“用一条语句”,我都想了一个小时了,还没想出来呢,要是用游标,那不太简单了?值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是不正确的。"带我信乐"同志,楼主说的是只一个表,不是两个表。
楼主别急,我好好想想,应该有办法的。只是估计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是不正确的。"带我信乐"同志,楼主说的是只一个表,不是两个表。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询