高手,求救了.查询每个版块中的热贴!!!!!!!!!!

吉普赛的歌 版主 2009-09-04 11:25:15
原表:

表 头: 版块号,标题,最高点击数
第1行: 1 ,想法,7
第2行: 1 ,恋爱,5
第3行: 2 ,打架,3
第4行: 2 ,小子,2

要求:显示每个版块中的最高点击数的记录!
在上表中:显示第1行和第3行即为所求了.

可SQL语句怎么写呢?高手们,小弟先谢过了!!!!!!!!!!
...全文
119 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
mbh0210 2009-09-05
  • 打赏
  • 举报
回复
要求:显示每个版块中的最高点击数的记录!
在上表中:显示第1行和第3行即为所求了.

因为: 上面只能返回最高点击数的前两条记录,它根本上分不清是哪一个版块的.
我要的效果是: 返回每一个版块的 点击数 最高的两条记录.

你两次说的差别很大啊
q85958341 2009-09-05
  • 打赏
  • 举报
回复
继续收藏~贴王 小F
  • 打赏
  • 举报
回复
create table tb(id int ,name varchar(20))
insert into tb
select '56','z' union all
select '58','z' union all
select '59','z' union all
select '98','y' union all
select '56','y' union all
select '100','y'

select id,name from tb t where not exists(select id,name from tb b where b.id>t.id and b.name=t.name)
楼主试试这个,我做过了,成功的代码
dawugui 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yenange 的回复:]
此外, 贴子不一定是只有第1名啊, 如果规定前2名为热贴, 那又怎么写呢?
[/Quote]
select t.* from tb t where 最高点击数 in (select top 2 最高点击数 from tb where 版块号 = t.版块号 order by 版块号 desc)
吉普赛的歌 版主 2009-09-04
  • 打赏
  • 举报
回复
此外, 贴子不一定是只有第1名啊, 如果规定前2名为热贴, 那又怎么写呢?
翼帆 2009-09-04
  • 打赏
  • 举报
回复
围观中。。。
吉普赛的歌 版主 2009-09-04
  • 打赏
  • 举报
回复
已经通过, 谢谢各位!!
但是, 我还没有学到这些东西呀!!
书上只提示: 以 版块号 来分组,进行查询!!
可不可以 以版块号进行分组, 然后进行查询呢!
--小F-- 2009-09-04
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(我是小F,向高手学习)
-- Date :2009-09-04 11:41:14
-- Verstion:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([表头] varchar(5),[版块号] int,[标题] varchar(4),[最高点击数] int)
insert [tb]
select '第1行',1,'想法',7 union all
select '第2行',1,'恋爱',5 union all
select '第3行',2,'打架',3 union all
select '第4行',2,'小子',2
--------------开始查询--------------------------
select
*
from
tb t
where
not exists(select 1 from tb where 版块号 = t.版块号 and 最高点击数> t.最高点击数)
----------------结果----------------------------
/* 表头 版块号 标题 最高点击数
----- ----------- ---- -----------
第1行 1 想法 7
第3行 2 打架 3

(2 行受影响)

*/
dawugui 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 happyflystone 的回复:]
引用 7 楼 yenange 的回复:
同志们啊, 我的其实只有一个表 t 啊,
其次, 我的版块号也不一定只有两个.

写简单一点吧, 我只是个菜鸟而已......


楼上的方法你写个测试就知道了

实践才正道 
[/Quote]同意
--小F-- 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yenange 的回复:]
同志们啊, 我的其实只有一个表 t 啊,
其次, 我的版块号也不一定只有两个.

写简单一点吧, 我只是个菜鸟而已......
[/Quote]

已经是最简单的了
-狙击手- 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yenange 的回复:]
同志们啊, 我的其实只有一个表 t 啊,
其次, 我的版块号也不一定只有两个.

写简单一点吧, 我只是个菜鸟而已......
[/Quote]

楼上的方法你写个测试就知道了

实践才正道 
吉普赛的歌 版主 2009-09-04
  • 打赏
  • 举报
回复
同志们啊, 我的其实只有一个表 t 啊,
其次, 我的版块号也不一定只有两个.

写简单一点吧, 我只是个菜鸟而已......
--小F-- 2009-09-04
  • 打赏
  • 举报
回复
逼我当 贴王
--小F-- 2009-09-04
  • 打赏
  • 举报
回复
--处理表重复记录(查询和删除)
/******************************************************************************************************************************************************
1、Num、Name相同的重复值记录,没有大小关系只保留一条
2、Name相同,ID有大小关系时,保留大或小其中一个记录
整理人:中国风(Roy)

日期:2008.06.06
******************************************************************************************************************************************************/

--1、用于查询重复处理记录(如果列没有大小关系时2000用生成自增列和临时表处理,SQL2005用row_number函数处理)

--> --> (Roy)生成測試數據

if not object_id('Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))
Insert #T
select 1,N'A',N'A1' union all
select 2,N'A',N'A2' union all
select 3,N'A',N'A3' union all
select 4,N'B',N'B1' union all
select 5,N'B',N'B2'
Go


--I、Name相同ID最小的记录(推荐用1,2,3),方法3在SQl05时,效率高于1、2
方法1:
Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID<a.ID)

方法2:
select a.* from #T a join (select min(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID

方法3:
select * from #T a where ID=(select min(ID) from #T where Name=a.Name)

方法4:
select a.* from #T a join #T b on a.Name=b.Name and a.ID>=b.ID group by a.ID,a.Name,a.Memo having count(1)=1

方法5:
select * from #T a group by ID,Name,Memo having ID=(select min(ID)from #T where Name=a.Name)

方法6:
select * from #T a where (select count(1) from #T where Name=a.Name and ID<a.ID)=0

方法7:
select * from #T a where ID=(select top 1 ID from #T where Name=a.name order by ID)

方法8:
select * from #T a where ID!>all(select ID from #T where Name=a.Name)

方法9(注:ID为唯一时可用):
select * from #T a where ID in(select min(ID) from #T group by Name)

--SQL2005:

方法10:
select ID,Name,Memo from (select *,min(ID)over(partition by Name) as MinID from #T a)T where ID=MinID

方法11:

select ID,Name,Memo from (select *,row_number()over(partition by Name order by ID) as MinID from #T a)T where MinID=1

生成结果:
/*
ID Name Memo
----------- ---- ----
1 A A1
4 B B1

(2 行受影响)
*/


--II、Name相同ID最大的记录,与min相反:
方法1:
Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID>a.ID)

方法2:
select a.* from #T a join (select max(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID order by ID

方法3:
select * from #T a where ID=(select max(ID) from #T where Name=a.Name) order by ID

方法4:
select a.* from #T a join #T b on a.Name=b.Name and a.ID<=b.ID group by a.ID,a.Name,a.Memo having count(1)=1

方法5:
select * from #T a group by ID,Name,Memo having ID=(select max(ID)from #T where Name=a.Name)

方法6:
select * from #T a where (select count(1) from #T where Name=a.Name and ID>a.ID)=0

方法7:
select * from #T a where ID=(select top 1 ID from #T where Name=a.name order by ID desc)

方法8:
select * from #T a where ID!<all(select ID from #T where Name=a.Name)

方法9(注:ID为唯一时可用):
select * from #T a where ID in(select max(ID) from #T group by Name)

--SQL2005:

方法10:
select ID,Name,Memo from (select *,max(ID)over(partition by Name) as MinID from #T a)T where ID=MinID

方法11:
select ID,Name,Memo from (select *,row_number()over(partition by Name order by ID desc) as MinID from #T a)T where MinID=1

生成结果2:
/*
ID Name Memo
----------- ---- ----
3 A A3
5 B B2

(2 行受影响)
*/
--小F-- 2009-09-04
  • 打赏
  • 举报
回复
select 
*
from
tb t
where
not exists(select 1 from tb where 版块号 = t.版块号 and 最高点击数> t.最高点击数)
黄_瓜 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 happyflystone 的回复:]
select *
from ta  a
where not exists(select 1 from ta where 版块号 = a.版块号 and 最高点击数> a.最高点击数)
[/Quote]
正解
dawugui 2009-09-04
  • 打赏
  • 举报
回复
select t.* from tb t where 最高点击数 = (select max(最高点击数 ) from tb where 版块号 = t.版块号) order by t.版块号
-狙击手- 2009-09-04
  • 打赏
  • 举报
回复
select *
from ta a
where not exists(select 1 from ta where 版块号 = a.版块号 and 最高点击数> a.最高点击数)
--小F-- 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yenange 的回复:]
其实你们都搞错了.

-----你们的答案-----
select t.* from tb t where 最高点击数 in (select top 2 最高点击数  from tb where 版块号 = t.版块号 order by 版块号 desc)
-------------------

根本上不行, 后来我才回过味来.

因为: 上面只能返回最高点击数的前两条记录,它根本上分不清是哪一个版块的.

我要的效果是: 返回每一个版块的 点击数 最高的两条记录.
[/Quote]

---------------------------------
-- Author: liangCK 小梁
-- Title : 查每个分组前N条记录
-- Date : 2008-11-13 17:19:23
---------------------------------

--> 生成测试数据: #T
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T (ID VARCHAR(3),GID INT,Author VARCHAR(29),Title VARCHAR(39),Date DATETIME)
INSERT INTO #T
SELECT '001',1,'邹建','深入浅出SQLServer2005开发管理与应用实例','2008-05-10' UNION ALL
SELECT '002',1,'胡百敬','SQLServer2005性能调校','2008-03-22' UNION ALL
SELECT '003',1,'格罗夫Groff.J.R.','SQL完全手册','2009-07-01' UNION ALL
SELECT '004',1,'KalenDelaney','SQLServer2005技术内幕存储引擎','2008-08-01' UNION ALL
SELECT '005',2,'Alex.Kriegel.Boris.M.Trukhnov','SQL宝典','2007-10-05' UNION ALL
SELECT '006',2,'飞思科技产品研发中心','SQLServer2000高级管理与开发','2007-09-10' UNION ALL
SELECT '007',2,'胡百敬','SQLServer2005数据库开发详解','2008-06-15' UNION ALL
SELECT '008',3,'陈浩奎','SQLServer2000存储过程与XML编程','2005-09-01' UNION ALL
SELECT '009',3,'赵松涛','SQLServer2005系统管理实录','2008-10-01' UNION ALL
SELECT '010',3,'黄占涛','SQL技术手册','2006-01-01'

--SQL查询如下:

--按GID分组,查每个分组中Date最新的前2条记录


--1.字段ID唯一时:
SELECT * FROM #T AS T WHERE ID IN(SELECT TOP 2 ID FROM #T WHERE GID=T.GID ORDER BY Date DESC)

--2.如果ID不唯一时:
SELECT * FROM #T AS T WHERE 2>(SELECT COUNT(*) FROM #T WHERE GID=T.GID AND Date>T.Date)

--SQL Server 2005 使用新方法

--3.使用ROW_NUMBER()进行排位分组
SELECT ID,GID,Author,Title,Date
FROM
(
SELECT rid=ROW_NUMBER() OVER(PARTITION BY GID ORDER BY Date DESC),*
FROM #T
) AS T
WHERE rid<=2

--4.使用APPLY
SELECT DISTINCT b.*
FROM #T AS a
CROSS APPLY
(
SELECT TOP(2) * FROM #T WHERE a.GID=GID ORDER BY Date DESC
) AS b


--结果
/*

ID GID Author Title Date
---- ----------- ----------------------------- --------------------------------------- -----------------------
003 1 格罗夫Groff.J.R. SQL完全手册 2009-07-01 00:00:00.000
004 1 KalenDelaney SQLServer2005技术内幕存储引擎 2008-08-01 00:00:00.000
005 2 Alex.Kriegel.Boris.M.Trukhnov SQL宝典 2007-10-05 00:00:00.000
007 2 胡百敬 SQLServer2005数据库开发详解 2008-06-15 00:00:00.000
009 3 赵松涛 SQLServer2005系统管理实录 2008-10-01 00:00:00.000
010 3 黄占涛 SQL技术手册 2006-01-01 00:00:00.000

(6 行受影响)
*/
吉普赛的歌 版主 2009-09-04
  • 打赏
  • 举报
回复
其实你们都搞错了.

-----你们的答案-----
select t.* from tb t where 最高点击数 in (select top 2 最高点击数 from tb where 版块号 = t.版块号 order by 版块号 desc)
-------------------

根本上不行, 后来我才回过味来.

因为: 上面只能返回最高点击数的前两条记录,它根本上分不清是哪一个版块的.

我要的效果是: 返回每一个版块的 点击数 最高的两条记录.

34,576

社区成员

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

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