数据库里结构大概是这样的产品号 产品名 所属品牌 访问量
305 紫光 8850ED 紫光 13785
1381 DELL LATITUDE L400(10GB/24XCD) DELL 8542
1387 DELL LATITUDE L400(20GB/8XDVD) DELL 3542
11119 联想 昭阳2110CF 联想 58954
14913 DELL LATITUDE C600 DELL 5468
16065 联想 昭阳K21 联想 210
16876 SONY GR18C SONY 0
17370 DELL 38N2-14 85C DELL 125
19001 DELL LATITUDE C810 DELL 3986
20402 联想 昭阳S280CFe 联想 1578
我要实现的功能是,找出这样的产品,他们是每一个品牌的访问量前3位的产品(访问量从高到底),
这些产品找出后,优先按访问量从高到低显示(注意,是访问量前3位按访问量显示,不是按品牌或产品名显示)
剩下的产品,统一按访问量从高到低显示
在线等候,谢谢
305 紫光 8850ED 紫光 13785
1381 DELL LATITUDE L400(10GB/24XCD) DELL 8542
1387 DELL LATITUDE L400(20GB/8XDVD) DELL 3542
11119 联想 昭阳2110CF 联想 58954
14913 DELL LATITUDE C600 DELL 5468
16065 联想 昭阳K21 联想 210
16876 SONY GR18C SONY 0
17370 DELL 38N2-14 85C DELL 125
19001 DELL LATITUDE C810 DELL 3986
20402 联想 昭阳S280CFe 联想 1578
我要实现的功能是,找出这样的产品,他们是每一个品牌的访问量前3位的产品(访问量从高到底),
这些产品找出后,优先按访问量从高到低显示(注意,是访问量前3位按访问量显示,不是按品牌或产品名显示)
剩下的产品,统一按访问量从高到低显示
在线等候,谢谢
解决方案 »
- 简单触发器
- 如何join时如果多条只取一条
- 如何排列这样的数据?
- 子查询和左连接,右连接,内连接要用哪种好
- 高分!!帮忙根据范式整理一个表!!诚谢!
- 是用JAVA直接分析存在文件中的数据的速度快还是用JAVA分析存在SQL2005中的数据的速度快哦?
- 用C# sqlconnection连接SQL测试不能通过
- 安装Sql Server 2000 的问题
- pb7开发程序分发到客户机就是连接不到win sql server2000,到底需要哪些*.dll,注册表需要怎么改(不要让客户端配置)
- 如何获取sql server 数据目录路径
- 对于库存管理,生成数量为0但是金额不为0的入库单或出库单,在财务上合法吗?
- 100分急求一个简单的sql,要求执行效率高就可以,谢谢
with reny
(select *, CN=ROW_NUMBER() OVER (PARTITION BY 所屬品牌 ORDER BY 訪問量)
from Tb
)
select * from reny where cn<=3
下麵的是SQL2000的寫法
select * from
(select top 3 * from
(select *,num=(select count(*) from tb a where a.品牌=b.品牌 and a.訪問量<b.訪問量) from tb b) reny
order by num desc) a
order by num
SELECT *
FROM TB T
WHERE (SELECT COUNT(1)+1 FROM TB WHERE 所属品牌=t.所属品牌 and 访问量>t.访问量)<=3
ORDER BY 访问量 DESC
select * from
(select top 3 * from
(select *,num=(select count(*) from tb a where a.品牌=b.品牌 and a.訪問量<b.訪問量) from tb b) reny
order by num desc) a
order by num这个好像是按照 品牌数排列的,不是按产品的访问量排列的to:ai_li7758521
SELECT *
FROM TB T
WHERE (SELECT COUNT(1)+1 FROM TB WHERE 所属品牌=t.所属品牌 and 访问量>t.访问量) <=3
ORDER BY 访问量 DESC 这句不错啊,能把每个品牌的前3位找出来,并最后按访问量排序
不过还需要一句话,就是剩下的产品(不是前3位的),直接按访问量排序(没有刚才第一步
“把每个品牌的前3位找出来,并最后按访问量排序”
优先级高,也就是说这个选择出来的,永远在第一步排好的后面
)
-- 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 行受影响)
*/
那最后加一个 ORDER BY 访问量 DESC 就可以了
(select *,num=(select count(*) from tb a where a.品牌=b.品牌 and a.訪問量 >b.訪問量) from tb b) reny ----此處修改為>號.
order by num
select top 3 * from
(select *,num=(select count(*) from tb a where a.品牌=b.品牌 and a.訪問量 >b.訪問量) from tb b) reny
----此處修改一下為>,我把思路弄反了.
order by num
create table product
(
产品号 char(20) ,
产品名 char(60) ,
所属品牌 char(20) ,
访问量 int
)
-------------------------------------------------------------
insert product
select '305', '紫光 8850ED','紫光', 13785
insert product
select '1381', 'DELL LATITUDE L400(10GB/24XCD)', 'DELL', 8542
insert product
select '1387', 'DELL LATITUDE L400(20GB/8XDVD)' ,'DELL', 3542
insert product
select '11119', '联想 昭阳2110CF' , '联想' ,58954
insert product
select '14913', 'DELL LATITUDE C600' ,'DELL', 5468
insert product
select '16065', '联想 昭阳K21' , '联想', 210
insert product
select '16876', 'SONY GR18C' , 'SONY', 0
insert product
select '17370', 'DELL 38N2-14 85C' , 'DELL', 125
insert product
select '19001', 'DELL LATITUDE C810' ,'DELL' ,3986
insert product
select '20402', '联想 昭阳S280CFe' , '联想', 1578
-------------------------------------------------------------------
1381 DELL LATITUDE L400(10GB/24XCD) DELL 8542
1387 DELL LATITUDE L400(20GB/8XDVD) DELL 3542
14913 DELL LATITUDE C600 DELL 5468
17370 DELL 38N2-14 85C DELL 125
19001 DELL LATITUDE C810 DELL 3986
16876 SONY GR18C SONY 0
16065 联想 昭阳K21 联想 210
11119 联想 昭阳2110CF 联想 58954
20402 联想 昭阳S280CFe 联想 1578
305 紫光 8850ED 紫光 13785
---------------------------------------------------------select A.[所属品牌],A.[访问量] from product A
where A.[产品号] in
(
select top 3 B.[产品号] from product B
where A.[所属品牌]=B.[所属品牌]
)
order by [所属品牌],[访问量] desc
--结果--------------------------------------------------
所属品牌 访问量
--------- -------------
DELL 8542
DELL 5468
DELL 3542
SONY 0
联想 58954
联想 1578
联想 210
紫光 13785
declare @tb table (产品号 int,产品名 nvarchar(100),所属品牌 nvarchar(100),访问量 int)
insert into @tb select 305,'紫光8850ED','紫光',13785
union all select 1381,'DELL LATITUDEL400(10GB/24XCD)','DELL',8542
union all select 1387,'DELL LATITUDEL400(20GB/8XDVD)','DELL',3542
UNION ALL select 11119,'联想昭阳2110CF','联想',58984
UNION ALL SELECT 14913,'DELL LATITUDE C600','DELL',5468
UNION ALL SELECT 16065,'联想昭阳K21','联想',210
union all select 16876,'SONYGR18C','SONY',0
UNION ALL SELECT 17370,'DELL38N2-14 85C','DELL',125
union all select 19001,'DELLLATITUDE C810','DELL',3986
union all select 20402,'联想昭阳S280CFe','联想',1578
select * from @tb a where 3>
(select COUNT(*) from @tb where 所属品牌=a.所属品牌 and 访问量>a.访问量)
order by 所属品牌(10 行受影响)
产品号 产品名 所属品牌 访问量
----------- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- -----------
1381 DELL LATITUDEL400(10GB/24XCD) DELL 8542
14913 DELL LATITUDE C600 DELL 5468
19001 DELLLATITUDE C810 DELL 3986
16876 SONYGR18C SONY 0
20402 联想昭阳S280CFe 联想 1578
16065 联想昭阳K21 联想 210
11119 联想昭阳2110CF 联想 58984
305 紫光8850ED 紫光 13785(8 行受影响)