三个用户A B C
A 今天发了30条信息
B 昨天发了30条信息
c 今天发了30条信息,但早于A要求: 第一,用户必须交叉排序,第二,某一个用户的信息必须是最新的在最前面
      查询结果为:A1,C1,B1,A2,C2,B2.....A30,C30,B30
求各位sql高手帮忙
在线等!!!!

解决方案 »

  1.   

    select t.*, row_number() over (partition by t.用户 order by t.留言时间 desc) row
     from 表 t order by row, t.用户
    order by用户可以不要,row_number...也可以直接放在order by后面
      

  2.   

    请问row_number()是函数吗? over是什么意思 partition by t.用户 order by t.留言时间 desc呢?
      

  3.   

    Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。
    下面例子中使用的表来自Oracle自带的HR用户下的表,如果没有安装该用户,可以在SYS用户下运行$ORACLE_HOME/demo/schema/human_resources/hr_main.sql来创建。        
    少数几个例子需要访问SH用户下的表,如果没有安装该用户,可以在SYS用户下运行$ORACLE_HOME/demo/schema/sales_history/sh_main.sql来创建。        
    如果未指明缺省是在HR用户下运行例子。        
    开窗函数的理解:        
    开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
    over(order by salary) 按照salary排序进行累计,
    order by是个默认的开窗函数
    over(partition by deptno)按照部门分区
    over(order by salary range between 50 preceding and 150 following)每行对应的数据窗口是之前行幅度值不超过50,之后行幅度值不超过150
    over(order by salary rows between 50 preceding and 150 following)每行对应的数据窗口是之前50行,之后150行
    over(order by salary rows between unbounded preceding and unbounded following)每行对应的数据窗口是从第一行到最后一行,等效:over(order by salary range between unbounded preceding and unbounded following)ROW_NUMBER 功能描述:返回有序组中一行的偏移量,从而可用于按特定标准排序的行号。
    SAMPLE:下例返回每个员工再在每个部门中按员工号排序后的顺序号
    SELECT department_id
    , last_name
    , employee_id
    , ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY employee_id) AS emp_id  
    FROM employees
    WHERE department_id < 50;