当前位置: 代码迷 >> Sql Server >> 一个简略的sql查询(续)
  详细解决方案

一个简略的sql查询(续)

热度:18   发布时间:2016-04-27 11:04:15.0
一个简单的sql查询(续)
表user  
select id,name,gradetypeid,brownum,age,meteid from [user]
结果
1 张三 1 11 7 1
8 张四 2 16 8 2
2 张五 2 17 7 3
4 张六 3 16 9 4
6 张七 3 18 7 5
5 张八 2 19 9 6
3 张九 2 21 10 7
7 张十 3 41 7 8
9 李一 1 71 7 9
10 李二 3 99 7 10
11 李四 1 88 10 11
表grade
select id, gradename,gradeid,gradetypeid,gradetypename,meteid from [grade]
结果
1 一年级 1 1 小学 1
8 二年级 2 2 初中 2
2 二年级 2 2 初中 3
4 四年级 4 3 高中 4
6 三年级 3 3 高中 5
5 二年级 2 2 初中 6
3 四年级 4 2 初中 7
7 一年级 1 3 高中 8
9 一年级 1 1 小学 9
10 三年级 3 3 高中 10
11 四年级 4 1 小学 11
两个表关联 meteid = meteid gradetypeid=gradetypeid

想通过两个表联查得到结果 :根据年级和点击率排序 只要每个学年的前两名brow最高

id name gradename gradetypeid brownum age
9 李一 一年级 1 71 7
7 张十 一年级 1 41 7
5 张八 二年级 2 19 9
2 张五 二年级 2 17 7 
10 李二 三年级 3 99 7
6 张七 三年级 3 18 7
11 李四 四年级 4 88 10
3 张九 四年级 4 21 10

------解决方案--------------------
lz可以参考下t-sql的排名函数
关联得出结果后 n=rownumber() 0ver(partition by 年级 order by 点击 desc )
然后筛选where n<=2的记录
------解决方案--------------------
SQL code
-->try;with t1 as(    select id,name,gradetypeid,brownum,age,meteid from [user]),t2 as(    select id, gradename,gradeid,gradetypeid,gradetypename,meteid from [grade])select  c.gradename,a.* from t1 a,t2 cwhere [brownum]IN (select top 2 [brownum] from t1 b where a.[gradename]=b.[gradename] order by [brownum] desc)and a.id=c.idORDER BY [gradename]  ,[brownum] DESC
------解决方案--------------------
SQL code
WITH cte1 AS(SELECT id,        name,        gradetypeid,        brownum,        age,        meteid FROM   [user]),cte2 AS(SELECT id,        gradename,        gradeid,        gradetypeid,        gradetypename,        meteid FROM   [grade])SELECT   c.gradename,         a.*FROM     cte1 a,         cte2 cWHERE    [brownum] IN (SELECT   top 2  [brownum]                       FROM     cte1 b                       WHERE    a.[gradename] = b.[gradename]                       ORDER BY [brownum] DESC)         AND a.id = c.idORDER BY [gradename],         [brownum] DESC
------解决方案--------------------
SQL code
CREATE TABLE User1(id int,name varchar(10),gradetypeid int,brownum int,age int,meteid int)INSERT INTO User1SELECT 1,'张三',1,11,7,1  UNION ALLSELECT 8,'张四',2,16,8, 2 UNION ALLSELECT 2,'张五',2,17,7, 3 UNION ALLSELECT 4 ,'张六',3,16,9, 4 UNION ALLSELECT 6 ,'张七',3,18,7, 5 UNION ALLSELECT 5 ,'张八',2,19,9, 6 UNION ALLSELECT 3 ,'张九',2,21,10,7 UNION ALLSELECT 7 ,'张十',3,41,7, 8 UNION ALLSELECT 9 ,'李一',1,71,7, 9 UNION ALLSELECT 10,'李二',3,99,7, 10 UNION ALLSELECT 11,'李四',1,88,10, 11CREATE TABLE User2(id int, gradename varchar(10),gradeid int,gradetypeid int,gradetypename varchar(10),meteid int)INSERT INTO User2SELECT 1,'一年级',1 ,1 ,'小学', 1 UNION ALLSELECT 8,'二年级', 2 ,2 ,'初中',  2 UNION ALLSELECT 2,'二年级', 2 ,2 ,'初中',  3 UNION ALL SELECT 4,'四年级', 4 ,3 ,'高中',  4 UNION ALLSELECT 6,'三年级', 3 ,3 ,'高中',  5 UNION ALLSELECT 5,'二年级', 2 ,2 ,'初中',  6 UNION ALLSELECT 3,'四年级', 4 ,2 ,'初中',  7 UNION ALLSELECT 7,'一年级', 1 ,3 ,'高中',  8 UNION ALLSELECT 9,'一年级', 1 ,1 ,'小学',  9 UNION ALLSELECT 10,'三年级', 3 ,3 ,'高中',  10 UNION ALLSELECT 11,'四年级', 4 ,1 ,'小学',  11select * from (SELECT ROW_NUMBER() OVER (partition by T0.gradename ORDER BY bROWnUM DESC) ids,T0.id,name,gradename,T1.gradetypeid,brownum,age FROM User2 T0 LEFT JOIN User1 T1 ON T0.id = T1.id ) A0where ids<=2order by brownum/*ids                  id          name       gradename  gradetypeid brownum     age-------------------- ----------- ---------- ---------- ----------- ----------- -----------2                    2           张五         二年级        2           17          72                    6           张七         三年级        3           18          71                    5           张八         二年级        2           19          92                    3           张九         四年级        2           21          102                    7           张十         一年级        3           41          71                    9           李一         一年级        1           71          71                    11          李四         四年级        1           88          101                    10          李二         三年级        3           99          7(8 行受影响)*/
  相关解决方案