2017-06-02 1 views
0

私は非常にユニークなクエリを書いていますが、それを1つのクエリですべて実行することを望んでいますが、できるかどうかはわかりません。このクエリの解析関数の使い方

私は記事のリストを持っています、各記事は一意のIDを持っています。アプリケーションはこのIDをストアドプロシージャに渡します。その後、私はその記事を検索し、次に、次の&の記事を検索します。だから、リストは日付順にソートされ、次は&を前にすることができます。

私はこれをLEAD & LAGで行います。 1つのクエリで動作します。しかし、場合によっては、次のまたは前の記事がフィールドの1つにNULLを持つことがあります。そのフィールドがNULLの場合、基本的には、そのフィールドがNOT NULLである次の記事を取得します。

さらにもう1つあります。アプリケーションから渡された記事にはカテゴリが割り当てられています。次の&の前の記事は同じカテゴリのものでなければなりません。

クエリはかなり大きいですが、サブクエリとして渡されたアーティクルIDの前の次の&がすべて日付順に並べ替えられます。しかし、これらの2つの新しい基準、つまりNULL係数とカテゴリ係数では、これを1つのクエリでどのように行うことが可能かはわかりません。

どのような考えですか?または、いくつかの例や既存のクエリが必要ですか?

ありがとうございます。

答えて

0

オラクルセットアップ

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