表a (userid, time , partId)
需要写sql 每个分组 partid下 的按时间排序的userid 的前20的   max(Time) lastLoginTime, count(1) + 1
原有的 sql如下:
select userId, max(time ) lastLoginTime, count(1) + 1 nrOfLogins, partId  from a
where lastLoginTime>curdate() group by  userId
order by lastLoginTime desc limit 20
这个是最简单 灭有考虑partid现在要求写sql 每个分组 partid下 的按时间排序的userid 的前20的   max(Time) lastLoginTime, count(1) + 1,
如果是sqlserver或者oracle有强大的分区partition函数来处理不知道mysql下 ,如何做 :需要每个分组 partid下 的按时间排序的userid 的前20的   max(Time) lastLoginTime, count(1) + 1    (group by partId, user    补充说明 partid有20个 
得到结果应该如下 
userid  time count  partid
                     1
                      .
                      .
                      2
                      .
                      .                       总共应该有20×20=400记录  , partid=1的有20 (其他partid=2等也一样各有20)
    
推理因该是 group by partId ,userid   ---下面就不知道如何写? )

解决方案 »

  1.   

    如果用 java来做是很简单的 while (rs)
    {
    select userId, max(time ) lastLoginTime, count(1) + 1 nrOfLogins, partId from a
    where lastLoginTime>curdate() 
    where partId=?
    group by userId
    order by lastLoginTime desc limit 20
    }
    但是这个代价太大 。需要执行20多次 。
    如果是一条慢sql 容忍执行10分钟 出结果 还是可以接受的 
      

  2.   

    可以参考下贴。http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
    分组取最大N条记录方法征集
      

  3.   

    SELECT a.id,a.gid,a.col1,a.col2 FROM t2v a
    LEFT JOIN t2v b
    ON a.gid=b.gid AND a.col2<=b.col2
    GROUP BY a.id,a.gid,a.col1,a.col2
    HAVING COUNT(b.id)<=3
    ORDER BY a.gid,a.col2 desc
    可以参考 partId =gid id =userid 但是 max(time ) lastLoginTime, count(1) + 1 nrOfLogins  这2个没有办法 
    max 和couont是聚合函数  这个如何修改 ??/