近来在做一个小开发的时候,对于名次的排序有点头大,麻烦大家帮看一下。
数据库结构:
用户编号     用户姓名  年度发帖 月度发帖  今日发帖
120501115   张三      1584    162      29
120522081   李四      487      327      0
121427000   XX县      0        0       0
121427157   王五      12       0      0
122227002   赵六      2514     399     15........现在的问题在于,用户编号的前六位是地域编号,如12代表A省,05、14、22分别是B市、C市、D市,120501代表A省B市E区,122227代表A省D市F县…………
客户要求在登录用户查看个人信息时,显示出他在全省、全市、全县的不同排名,如张三显示的是:
今年以来:
您是全省第二名,本市第一名,本区(县)第一名
本月以来:
您是全省第三名,本市第二名,本区(县)第一名
今天:
您是全省第一名,本市第一名,本区(县)第一名李四显示的是:
今年以来:
您是全省第三名,本市第二名,本区(县)第一名
本月以来:
您是全省第二名,本市第一名,本区(县)第一名
今天:
您的发帖量为0,不计算排名(只要是发帖量为0的,都可以直接不计算排名,当然这个步骤可以在ASP里来判断,SQL只要输出0就行了)
数据表中共有用户信息约二万条,暂时都在一个省内,约有二十个地市,近二百个区县的数据,年度、月度、本日的数据我可以用定时作业先统计好,但排名就有点头大,还要大家帮我考虑一下怎么做比较好呢?如果发帖量相同的情况下,如果能并列前名次最好(也就是说可以一个第一名,三个第二名,而不是一个第一名,三个第四名这种),如果难做到的话,并列后名次也行。感谢大家!

解决方案 »

  1.   

    如果只是用语句将用户排名取出来,那还是相当简单的,只不过计算量比较大.csdn的积分排名榜是定期更新的, 你要是每次用户上线都即时统计, 并发数多时,系统受不了.
      

  2.   

    declare @Ta table(用户编号 nvarchar(20),    用户姓名 nvarchar(10),  年度发帖 int,月度发帖 int, 今日发帖 int)
    insert @Ta select '120501115',   '张三',      1584,    162,      29 
    insert @Ta select '120522081',   '李四',      487,      327,      0 
    insert @Ta select '121427000',   'XX县',      0,        0,       0 
    insert @Ta select '121427157',   '王五',      12,       0,      0 
    insert @Ta select '122227002',   '赵六',      2514,     399,     15
    select 
    用户编号,用户姓名,
    (select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 年度发帖>t.年度发帖)+1 as '年度省排名',
    (select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 年度发帖>t.年度发帖)+1 as '年度市排名',
    (select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 年度发帖>t.年度发帖)+1 as '年度区排名'
    from 
    @Ta tselect 
    用户编号,用户姓名,
    (select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 月度发帖>t.月度发帖)+1 as '月度省排名',
    (select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 月度发帖>t.月度发帖)+1 as '月度市排名',
    (select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 月度发帖>t.月度发帖)+1 as '月度区排名'
    from 
    @Ta tselect 
    用户编号,用户姓名,
    (select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 今日发帖>t.今日发帖)+1 as '今日省排名',
    (select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 今日发帖>t.今日发帖)+1 as '今日市排名',
    (select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 今日发帖>t.今日发帖)+1 as '今日区排名'
    from 
    @Ta t(所影响的行数为 1 行)用户编号                 用户姓名       年度省排名       年度市排名       年度区排名       
    -------------------- ---------- ----------- ----------- ----------- 
    120501115            张三         2           1           1
    120522081            李四         3           2           1
    121427000            XX县        5           2           2
    121427157            王五         4           1           1
    122227002            赵六         1           1           1(所影响的行数为 5 行)用户编号                 用户姓名       月度省排名       月度市排名       月度区排名       
    -------------------- ---------- ----------- ----------- ----------- 
    120501115            张三         3           2           1
    120522081            李四         2           1           1
    121427000            XX县        4           1           1
    121427157            王五         4           1           1
    122227002            赵六         1           1           1(所影响的行数为 5 行)用户编号                 用户姓名       今日省排名       今日市排名       今日区排名       
    -------------------- ---------- ----------- ----------- ----------- 
    120501115            张三         1           1           1
    120522081            李四         3           2           1
    121427000            XX县        3           1           1
    121427157            王五         3           1           1
    122227002            赵六         2           1           1(所影响的行数为 5 行)
      

  3.   


    --您的发帖量为0,不计算排名 declare @Ta table(用户编号 nvarchar(20),    用户姓名 nvarchar(10),  年度发帖 int,月度发帖 int, 今日发帖 int)
    insert @Ta select '120501115',   '张三',      1584,    162,      29 
    insert @Ta select '120522081',   '李四',      487,      327,      0 
    insert @Ta select '121427000',   'XX县',      0,        0,       0 
    insert @Ta select '121427157',   '王五',      12,       0,      0 
    insert @Ta select '122227002',   '赵六',      2514,     399,     15
    select 
    用户编号,用户姓名,case when 年度发帖=0 then 0 else
    (select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 年度发帖>t.年度发帖)+1 end as '年度省排名',
    case when 年度发帖=0 then 0 else 
    (select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 年度发帖>t.年度发帖)+1 end as '年度市排名',
    case when 年度发帖=0 then 0 else
    (select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 年度发帖>t.年度发帖)+1  end as '年度区排名'
    from 
    @Ta tselect 
    用户编号,用户姓名,case when 月度发帖=0 then 0 else
    (select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 月度发帖>t.月度发帖)+1 end as '月度省排名',
    case when 月度发帖=0 then 0 else 
    (select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 月度发帖>t.月度发帖)+1 end as '月度市排名',
    case when 月度发帖=0 then 0 else 
    (select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 月度发帖>t.月度发帖)+1 end as '月度区排名'
    from 
    @Ta tselect 
    用户编号,用户姓名,
    case when 今日发帖=0 then 0 else
    (select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 今日发帖>t.今日发帖)+1 end as '今日省排名',
    case when 今日发帖=0 then 0 else
    (select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 今日发帖>t.今日发帖)+1 end as '今日市排名',
    case when 今日发帖=0 then 0 else
    (select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 今日发帖>t.今日发帖)+1 end as '今日区排名'
    from 
    @Ta t
    用户编号                 用户姓名       年度省排名       年度市排名       年度区排名       
    -------------------- ---------- ----------- ----------- ----------- 
    120501115            张三         2           1           1
    120522081            李四         3           2           1
    121427000            XX县        0           0           0
    121427157            王五         4           1           1
    122227002            赵六         1           1           1(所影响的行数为 5 行)用户编号                 用户姓名       月度省排名       月度市排名       月度区排名       
    -------------------- ---------- ----------- ----------- ----------- 
    120501115            张三         3           2           1
    120522081            李四         2           1           1
    121427000            XX县        0           0           0
    121427157            王五         0           0           0
    122227002            赵六         1           1           1(所影响的行数为 5 行)用户编号                 用户姓名       今日省排名       今日市排名       今日区排名       
    -------------------- ---------- ----------- ----------- ----------- 
    120501115            张三         1           1           1
    120522081            李四         0           0           0
    121427000            XX县        0           0           0
    121427157            王五         0           0           0
    122227002            赵六         2           1           1(所影响的行数为 5 行)
      

  4.   

    declare @Ta table(用户编号 nvarchar(20),    用户姓名 nvarchar(10),  年度发帖 int,月度发帖 int, 今日发帖 int)
    insert @Ta select '120501115',   '张三',      1584,    162,      29 
    insert @Ta select '120522081',   '李四',      487,      327,      0 
    insert @Ta select '121427000',   'XX县',      0,        0,       0 
    insert @Ta select '121427157',   '王五',      12,       0,      0 
    insert @Ta select '122227002',   '赵六',      2514,     399,     15select
    用户编号,用户姓名,[省排名],[市排名],[区排名]from 
    (select 
    用户编号,用户姓名,case when 年度发帖=0 then '' else '年度全省第'+rtrim(
    (select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 年度发帖>t.年度发帖)+1)+'名' end as '省排名',
    case when 年度发帖=0 then '' else '年度本市第'+rtrim(
    (select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 年度发帖>t.年度发帖)+1)+'名'end as '市排名',
    case when 年度发帖=0 then '' else '年度本区'+rtrim(
    (select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 年度发帖>t.年度发帖)+1)+'名' end as '区排名',
    [Order]=1
    from 
    @Ta t
    union all select 
    用户编号,用户姓名,case when 月度发帖=0 then '' else '月度全省第'+rtrim(
    (select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 月度发帖>t.月度发帖)+1)+'名' end as '月度省排名',
    case when 月度发帖=0 then '' else '月度全市第'+rtrim(
    (select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 月度发帖>t.月度发帖)+1)+'名' end as '市排名',
    case when 月度发帖=0 then '' else '月度区'+rtrim(
    (select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 月度发帖>t.月度发帖)+1)+'名' end as '区排名',
    [Order]=2
    from 
    @Ta t
    union all 
    select 
    用户编号,用户姓名,
    case when 今日发帖=0 then '' else '今日省'+rtrim(
    (select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 今日发帖>t.今日发帖)+1)+'名' end as '省排名',
    case when 今日发帖=0 then '' else '今日市'+rtrim(
    (select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 今日发帖>t.今日发帖)+1)+'名' end as '市排名',
    case when 今日发帖=0 then '' else '今日区'+rtrim(
    (select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 今日发帖>t.今日发帖)+1)+'名' end as '区排名',
    [Order]=3
    from 
    @Ta t
    ) tmp
    order by 用户编号,用户姓名,[Order] asc
    用户编号                 用户姓名       省排名                      市排名                      区排名                    
    -------------------- ---------- ------------------------ ------------------------ ---------------------- 
    120501115            张三         年度全省第2名                  年度本市第1名                  年度本区1名
    120501115            张三         月度全省第3名                  月度全市第2名                  月度区1名
    120501115            张三         今日省1名                    今日市1名                    今日区1名
    120522081            李四         年度全省第3名                  年度本市第2名                  年度本区1名
    120522081            李四         月度全省第2名                  月度全市第1名                  月度区1名
    120522081            李四                                                           
    121427000            XX县                                                          
    121427000            XX县                                                          
    121427000            XX县                                                          
    121427157            王五         年度全省第4名                  年度本市第1名                  年度本区1名
    121427157            王五                                                           
    121427157            王五                                                           
    122227002            赵六         年度全省第1名                  年度本市第1名                  年度本区1名
    122227002            赵六         月度全省第1名                  月度全市第1名                  月度区1名
    122227002            赵六         今日省2名                    今日市1名                    今日区1名(所影响的行数为 15 行)
      

  5.   

    谢谢roy_88,虽然我今天早上已经想出来了怎么编写了,但是还是没有你考虑的细,谢谢了!