我只有一个表要提取每个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或查询获得此输出?
答案 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,第二高的第二行,依此类推。