日期:2014-05-17  浏览次数:20539 次

一个简单的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 c
where [brownum]IN (select top 2 [brownum] from t1 b where a.[gradename]=b.[gradename] order by [brownum] desc)
and a.id=c.id
ORDER 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 c
WHERE    [brownum] IN (SELECT   top 2  [brownum]
                       FROM     cte1 b
                       WHERE    a.[gradename] = b.[gradename]
                       ORDER BY [brownum] DESC)
         AND a.id = c.id
ORDER BY [gradename],
         [brownum] DESC

------解决方案--------------------
SQL code

CREATE TABLE User1(id int,name varchar(10),gradetypeid int,brownum int,age int,meteid int)
INSERT INTO User1
SELECT 1,'张三',1,11,7,1  UNION ALL
SELECT 8,'张四',2,16,8, 2 UNION ALL
SELECT 2,'张五',2,17,7, 3 UNION ALL
SELECT 4 ,'张六',3,16,9, 4 UNION ALL
SELECT 6 ,'张七',3,18,7, 5 UNION ALL
SELECT 5 ,'张八',2,19,9, 6 UNION ALL
SELECT 3 ,'张九',2,21,10,7 UNION ALL
SELECT 7 ,'张十',3,41,7, 8 UNION ALL
SELECT 9 ,'李一',1,71,7, 9 UNION ALL
SELECT 10,'李二',3,99,7, 10 UNION ALL
SELECT 11,'李四',1,88,10, 11

CREATE TABLE User2(id int, gradename varchar(10),gradeid int,gradetypeid int,gradetypename varchar(10),meteid int)
INSERT INTO User2
SELECT 1,'一年级',1 ,1 ,'小学', 1 UNION ALL
SELECT 8,'二年级', 2 ,2 ,'初中',  2 UNION ALL
SELECT 2,'二年级', 2 ,2 ,'初中',  3 UNION ALL 
SELECT 4,'四年级', 4 ,3 ,'高中',  4 UNION ALL
SELECT 6,'三年级', 3 ,3 ,'高中',  5 UNION ALL
SELECT 5,'二年级', 2 ,2 ,'初中',  6 UNION ALL
SELECT 3,'四年级', 4 ,2 ,'初中',  7 UNION ALL
SELECT 7,'一年级', 1 ,3 ,'高中',  8 UNION ALL
SELECT 9,'一年级', 1 ,1 ,'小学',  9 UNION ALL
SELECT 10,'三年级', 3 ,3 ,'高中',  10 UNION ALL
SELECT 11,'四年级', 4 ,1 ,'小学',  11


select * 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 ) A0
where ids<=2
order by brownum

/*

ids