首页 > 解决方案 > 如何提取Oracle中每个id用户的前5行?

问题描述

我只有一个表,我想为每个表提取前 5 行ID_USER

我执行以下查询:

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

标签: sqloracleoracle11ggreatest-n-per-grouptop-n

解决方案


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

推荐阅读