如何在Oracle中为每个id用户提取前5行?

时间:2018-08-26 21:06:09

标签: sql oracle oracle11g greatest-n-per-group top-n

我只有一个表要提取每个ID_USER的前5行。

我执行以下查询:

SELECT
      ID_USER as U_ID_USER,
      COUNT(ID_USER) as NUM_TIC
FROM
     TABLE_USERS
GROUP BY ID_USER
ORDER BY ID_USER

运行时会返回以下信息:

U_ID_USER   NUM_TIC
16469       34
29012       4
33759       2

然后我想将ID_USER的每个值放在以下查询中,以仅提取前5行:

SELECT *
FROM(
SELECT
       DATE,
       ID_USER,
       C1,
       C2,
       C3
FROM 
       TABLE_USERS
WHERE
      ID_USER = '16469'
ORDER BY ID_USER)
WHERE ROWNUM < 6;

例如,ID_USER“ 16469”在运行时返回以下信息:

DATE       ID_USER   C1   C2   C3
13/12/17   16469     X    X    X
11/12/17   16469     X    X    X
07/12/17   16469     X    X    X
04/12/17   16469     X    X    X
01/12/17   16469     X    X    X

我想要的是PL / SQL中的一个自动过程或一个查询,该查询会给我这样的输出:

DATE       ID_USER   C1   C2   C3
13/12/17   16469     X    X    X
11/12/17   16469     X    X    X
07/12/17   16469     X    X    X
04/12/17   16469     X    X    X
01/12/17   16469     X    X    X
25/12/17   29012     X    X    X
20/12/17   29012     X    X    X
15/11/17   29012     X    X    X
10/11/17   29012     X    X    X
18/12/17   33759     X    X    X
15/12/17   33759     X    X    X

是否可以通过PL / SQL或查询获得此输出?

2 个答案:

答案 0 :(得分:4)

这可以通过row_number完成。

SELECT DATE,ID_USER,C1,C2,C3
FROM (SELECT
       T.*
      ,ROW_NUMBER() OVER(PARTITION BY ID_USER ORDER BY DATECOL DESC) AS RNUM
      FROM TABLE_USERS T
     ) T
WHERE RNUM < 6

答案 1 :(得分:4)

使用ROW_NUMBER()

SELECT date, id_user, c1, c2, c3
FROM (SELECT u.*,
             ROW_NUMBER() OVER (PARTITION BY id_user ORDER BY date DESC) as seqnum
      FROM table_users u
     )
WHERE seqnum <= 5;

使用rownum时,它将从结果集中返回那么多行。 ROW_NUMBER()是不同的。这是枚举行的函数。每个id_user都以“ 1”开头(基于PARTITION BY子句)。基于ORDER BY子句,日期最高的行的值为1,第二高的第二行,依此类推。