首页 > 解决方案 > sql oracle如何同时获取前10行和后10行

问题描述

我想写一个 oracle sql 查询我有这样的数据表:

Table A
no ID       Time
1 A001  9/27/2021 3:22:42 PM
2 A002  9/27/2021 3:25:58 PM
3 A003  9/27/2021 2:40:48 PM
4 A004  9/27/2021 2:40:44 PM
5 A005  9/27/2021 2:40:46 PM
6 A006  9/27/2021 2:40:51 PM
........................................

1000 A1000  9/27/2021 2:44:38 PM
1001 A1001  9/27/2021 2:44:47 PM
1002 A1002  9/27/2021 2:44:36 PM
1003 A1003  9/27/2021 2:44:40 PM
1004 A1004  9/27/2021 2:44:43 PM
1005 A1005  9/27/2021 2:43:57 PM
............................................
     A99999999999................................

还有 1 个这样的表:

Table B
No       ID                 Time
1       A03        9/27/2021 2:40:51 PM
2       A05        9/27/2021 2:44:36 PM
............................................
A999........................................

知道表 B 肯定在表 A 中。对于表 B 中的每一行,我们如何从表 A 上获取 10 行和下 10 行?目前我只使用 rank()、lag()、lead(),然后将 2 个表连接在一起,但还没有想要的结果

标签: sqloracle

解决方案


WITH JOINED_TABLES AS (
  SELECT "A".*, B."no" AS B_no
  , ROW_NUMBER() OVER (ORDER BY "A"."Time") AS RN
  FROM "A"
  LEFT JOIN B ON "A"."ID"=B."ID"
)
, CENTRE_RNS AS (
  SELECT RN FROM JOINED_TABLES WHERE B_no IS NOT NULL
)
SELECT J."no", J."ID", J."Time", C.RN FROM JOINED_TABLES J
LEFT JOIN CENTRE_RNS C ON J.RN BETWEEN C.RN-1 AND C.RN+1
ORDER BY "no"

SQL小提琴在这里

您可以将倒数第二行编辑为 -10 和 +10


推荐阅读