如何提取 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,依此类推。
我只有一个 table,我想为每个 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
其中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,依此类推。