【问题标题】:How to use Analytic Functions in this query如何在此查询中使用分析函数
【发布时间】:2017-06-02 00:49:54
【问题描述】:

我必须编写一个非常独特的查询,并希望在 1 个查询中完成所有操作,但不确定是否可以。

我有一个文章列表,每篇文章都有一个唯一的 ID。应用程序将此 ID 传递给存储过程。然后,我要检索那篇文章,以及下一篇和上一篇文章。所以,列表是按日期排序的,我可以得到下一个和上一个。

我通过 LEAD & LAG 做到这一点。它适用于一个查询。但是,在某些情况下,下一篇或上一篇文章的某个字段中有一个 NULL。如果该字段为 NULL,我基本上将获得下一篇该字段不为 NULL 的文章。

然后还有一件事。从应用程序传递的文章具有分配给它的类别。下一篇文章和上一篇文章必须属于同一类别。

查询现在相当大,但它可以获取文章 ID 的下一个和上一个,因为子查询按日期对所有内容进行排序。但是有了这 2 个新标准,即 NULL 因素和类别因素,我看不出如何在一个查询中做到这一点。

有什么想法吗?或者需要一些示例,或者我现有的查询?

感谢您的所有时间。

【问题讨论】:

    标签: oracle lag lead


    【解决方案1】:

    Oracle 设置

    CREATE TABLE articles ( id, category, value, dt ) AS
      SELECT 1, 1, 1,    DATE '2017-01-01' FROM DUAL UNION ALL
      SELECT 2, 1, 2,    DATE '2017-01-02' FROM DUAL UNION ALL -- Previous row
      SELECT 3, 1, NULL, DATE '2017-01-03' FROM DUAL UNION ALL -- Ignored as value is null
      SELECT 4, 1, 1,    DATE '2017-01-04' FROM DUAL UNION ALL -- Chosen id
      SELECT 5, 2, 3,    DATE '2017-01-05' FROM DUAL UNION ALL -- Ignored as different category
      SELECT 6, 1, 5,    DATE '2017-01-06' FROM DUAL;          -- Next row
    

    查询

    SELECT *
    FROM   (
    SELECT a.*,
           LAG( CASE WHEN value IS NOT NULL THEN id END ) IGNORE NULLS OVER ( PARTITION BY category ORDER BY dt ) AS prv,
           LEAD( CASE WHEN value IS NOT NULL THEN id END ) IGNORE NULLS OVER ( PARTITION BY category ORDER BY dt ) AS nxt
    FROM   articles a
    )
    WHERE :your_id IN ( id, nxt, prv )
    AND   ( id = :your_id OR value IS NOT NULL )
    ORDER BY dt;
    

    :your_id 在下面的示例输出中设置为 4。)

    输出

            ID   CATEGORY      VALUE DT                         PRV        NXT
    ---------- ---------- ---------- ------------------- ---------- ----------
             2          1          2 2017-01-02 00:00:00          1          4
             4          1          1 2017-01-04 00:00:00          2          6
             6          1          5 2017-01-06 00:00:00          4           
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 2011-06-28
      相关资源
      最近更新 更多