Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何在此查询中使用分析函数_Oracle_Lag_Lead - Fatal编程技术网

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

Oracle 如何在此查询中使用分析函数,oracle,lag,lead,Oracle,Lag,Lead,我必须编写一个非常独特的查询,并希望在一个查询中完成所有操作,但不确定是否可以 我有一个文章列表,每个文章都有一个唯一的ID。应用程序将这个ID传递给存储过程。然后,我将检索那篇文章,以及下一篇和上一篇文章。因此,列表按日期排序,我可以得到下一个和上一个 我通过超前和滞后来实现这一点。它在一个查询中工作。但是,在某些情况下,下一篇或上一篇文章的某个字段中有一个空值。如果该字段为NULL,我基本上会得到下一篇文章,其中该字段不为NULL 还有一件事。从应用程序传递的项目已分配给它一个类别。下一篇和

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

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

我通过超前和滞后来实现这一点。它在一个查询中工作。但是,在某些情况下,下一篇或上一篇文章的某个字段中有一个空值。如果该字段为NULL,我基本上会得到下一篇文章,其中该字段不为NULL

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

该查询现在相当大,但它可以在子查询按日期对所有内容排序时传递文章ID的下一个和上一个。但是有了这两个新的条件,NULL因子和category因子,我不知道如何在一个查询中做到这一点

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


感谢您的宝贵时间。

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;
        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           
查询

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;
        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           
:在下面的示例输出中,您的_id
设置为4。)

输出

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;
        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