sql语句查询不重复的前几条数据

查询数据时候需要根据登录时间字段取到前5个不重复的登录人

SELECT ROWNUM RN, T.* FROM
        (
            SELECT USER_ID FROM LUP_LOGIN_LOG ORDER BY LOGIN_TIME DESC
        ) T 

这个语句查询出来,要取前5个不重复的人的user_id

img

这个语句执行完有重复

        SELECT * FROM (
        SELECT ROWNUM RN, T.* FROM
        (
            SELECT USER_ID FROM LUP_LOGIN_LOG ORDER BY LOGIN_TIME DESC
        ) T 
        ) WHERE RN <= 5 

img

想要的意思大概是这样,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后排序就失效了

img

这个功能实在没办法了,取了前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 限制前几