查询数据时候需要根据登录时间字段取到前5个不重复的登录人
SELECT ROWNUM RN, T.* FROM
(
SELECT USER_ID FROM LUP_LOGIN_LOG ORDER BY LOGIN_TIME DESC
) T
这个语句查询出来,要取前5个不重复的人的user_id
这个语句执行完有重复
SELECT * FROM (
SELECT ROWNUM RN, T.* FROM
(
SELECT USER_ID FROM LUP_LOGIN_LOG ORDER BY LOGIN_TIME DESC
) T
) WHERE RN <= 5
想要的意思大概是这样,next()是我自己想的意思,或者是用distinct关键字,都试了不太好用
SELECT * FROM (
SELECT ROWNUM RN, T.* FROM
(
SELECT USER_ID FROM LUP_LOGIN_LOG ORDER BY LOGIN_TIME DESC
) T
) WHERE RN <= 5 AND USER_ID <> NEXT(USER_ID)
试试用group By
SELECT ROWNUM RN, T.* FROM
(
SELECT USER_ID FROM LUP_LOGIN_LOG ORDER BY LOGIN_TIME DESC
) T GROUP BY USER_ID
distinct能达到效果啊 ,先去重,再取前5个
SELECT * FROM (
SELECT ROWNUM RN, T.* FROM
(
SELECT distinct USER_ID FROM LUP_LOGIN_LOG ORDER BY LOGIN_TIME DESC
) T
) WHERE RN <= 5
在select 后面加destinct
加上distinct后排序就失效了
这个功能实在没办法了,取了前500个值,应该会有5个不重复的人,然后在业务层写的逻辑取到前5个加到linkedhashmap中的,就想万能的sql语句直接查询出来
你可以写两层,第一层distinct去重后的用户查询出来,在外面在套一个查询,在把序号展示出来就可以了。
SELECT t.user_id,add_time FROM (
SELECT
user_id,
count( user_id ) qune,
add_time
FROM a
WHERE
GROUP BY user_id,add_time
ORDER BY add_time DESC
)t where t.qune='1'
这个
1.先去时间段里的人
2.在去重
3.再根据时间排序,取limit 5,或者rownum的前面五个。
select * FROM (
SELECT USER_ID,RK FROM (
SELECT USER_ID,ROW_NUMBER() OVER(PARTITION BY USER_ID ORDER BY LOGIN_TIME desc) RK FROM LUP_LOGIN_LOG )
WHERE RK=1) WHERE ROWNUM <= 5
使用开窗函数,查询USER_ID 通过USER_ID 分组,并按照时间降序排序,RK=1 的是USER_ID 相同的数据中时间降序排第一的一条数据,取出所有RK=1 的数据相当于 去重,排序, 最后通过ROWNUM 限制前几