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

How to extract the first 5 rows for each id user in Oracle?

我只有一个 table,我想为每个 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

其中returns以下信息时运行:

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”returns时的如下信息运行:

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 或查询获得此输出?

这可以通过 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

使用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 时,它会 returns 结果集中的行数。 ROW_NUMBER() 不同。这是一个枚举行的函数。每个 id_user 都以“1”开头(基于 PARTITION BY 子句)。根据 ORDER BY 子句,日期最高的行获得值 1,第二高的行获得 2,依此类推。