【问题标题】:THREE ROWS LEAD FUNCTION IN ORACLE PL SQLORACLE PL SQL 中的三行前导函数
【发布时间】:2020-05-20 01:58:04
【问题描述】:

我的桌子:

ID  NAME
1   SIVA
2   RAJA
3   PYTHON
4   SQL
5   ODI

我需要领先 3 行。

我的 SQL 查询:

SELECT LEAD(NAME,3) OVER (ORDER by NAME) as NAME FROM TEST_TABLE where NAME='SIVA' 

预期输出:

--------
| NAME |
--------
| SQL  |
--------

例子:

如果我将值作为 SIVA 传递,那么我需要获取 SQL 作为输出。

同样,如果我将值作为 Raja 传递,那么我需要将 ODI 作为输出

是否有任何查询可以获得预期的输出?

【问题讨论】:

  • 我的输出为空
  • where NAME='SIVA' 将只选择一行(给定您的示例数据)。如果您的结果仅包含一行,您如何期望“进一步向下”获得一些价值 3 行。
  • 看起来你的第一次尝试几乎是正确的,也许你只是想要 OVER (ORDER BY id)? (编辑:请注意,尽管您必须在视图中评估分析函数并在之后应用 WHERE 子句)。

标签: sql oracle window-functions


【解决方案1】:

这可能是一种选择:它使用row_number 分析函数计算行数,这样您就不必依赖 ID 值。如果它们是通过序列获得的呢?它不是无间隙的。基本上 - 它用于安全

SQL> WITH test (id, name)
  2       AS (SELECT 1, 'siva' FROM DUAL
  3           UNION ALL
  4           SELECT 2, 'raja' FROM DUAL
  5           UNION ALL
  6           SELECT 3, 'python' FROM DUAL
  7           UNION ALL
  8           SELECT 4, 'sql' FROM DUAL
  9           UNION ALL
 10           SELECT 5, 'odi' FROM DUAL),
 11       temp AS (SELECT id, name, ROW_NUMBER () OVER (ORDER BY id) rn FROM test)
 12  SELECT b.name
 13    FROM temp a JOIN temp b ON b.rn = a.rn + 3
 14   WHERE a.name = '&name';
Enter value for name: siva

NAME
------
sql

SQL> /
Enter value for name: raja

NAME
------
odi

SQL> /
Enter value for name: sql

no rows selected

SQL>

【讨论】:

  • 3,651●11 个金徽章●77 个银徽章●1616 个铜徽章 1 感谢您的及时回复。但它不仅仅是 5 行,它包含大约 100 行。我在一个项目中工作,所以我不能在这里提供业务记录。所以我给了带有记录的样本表。 Union 不适用于 100 条记录,对于 @vBoka 的答案 id 在这里不是数字。它是 varchar,我们不应该键入 cast。唯一的解决方案是使用前导函数!
  • 正如我已经说过的:带有 UNION ALL 的部分代表您的示例数据。您不会输入,数据已经存储在您的表中,而我没有,所以我使用了 CTE(通用表表达式)。您将从第 11 行开始使用代码。除此之外,我看不出我的回答有任何“错误”。
【解决方案2】:

您可以简单地使用子查询:

SELECT Next_NAME 
FROM (SELECT NAME, LEAD(NAME, 3) OVER (ORDER by id) AS Next_NAME 
      FROM TEST_TABLE
     ) t
WHERE NAME = 'SIVA';

【讨论】:

  • 我无法删除我的答案,因为它已被接受(不知道...)。这是应该接受的。投票。唯一可能的问题是 id 是 varchar。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
相关资源
最近更新 更多