表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 ---下面就不知道如何写? )
需要写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 ---下面就不知道如何写? )
{
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分钟 出结果 还是可以接受的
分组取最大N条记录方法征集
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是聚合函数 这个如何修改 ??/