如何在此查询中使用分析函数

时间:2017-06-02 00:49:54

标签: oracle lag lead

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

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

我通过LEAD& amp;落后。它适用于一个查询。但是,在某些情况下,下一篇或上一篇文章在其中一个字段中为NULL。如果该字段为NULL,我基本上得到下一篇文章,其中该字段为NOT NULL。

然后还有一件事。从应用程序传递的文章有一个分配给它的类别。下一个&以前的文章必须属于同一类别。

现在这个查询非常大,但它可以帮助我们完成下一个问题。在子查询之前传递的文章ID之前按日期对所有内容进行排序。但是使用这两个新标准,NULL因子和类别因子,我看不出在一个查询中如何做到这一点。

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

感谢您的所有时间。

1 个答案:

答案 0 :(得分:0)

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