过滤分析函数中的行-Oracle

问题描述 投票:-1回答:2

我需要过滤分析函数中的行(例如:滞后)。有没有办法有效地没有子查询(这是一个很大的表)?

这是表格:

enter image description here

预期的结果应如下所示:

enter image description here

sql oracle query-performance
2个回答
0
投票

这看起来像是解析函数的典型用法。在这种情况下,我认为累积max()似乎合适:

select t.*,
       max(case when is_valid = 1 then date end) over 
           (partition by client_id
            order by date
            rows between unbounded preceding and 1 preceding
           ) as last_valid_session
from t;

尽管也可以使用lag()last_value(),但很难想到一种更简洁的方法来实现此逻辑:

select t.*,
       lag(case when is_valid = 1 then date end ignore nulls) over 
           (partition by client_id
            order by date
           ) as last_valid_session
from t;

0
投票

LAGIGNORE NULLSCASE表达式一起使用以仅过滤有效日期:

Oracle设置

CREATE TABLE test_data ( session_id, client_id, is_valid, "DATE" ) AS
SELECT  1, 11, 0, DATE '2018-01-01' FROM DUAL UNION ALL
SELECT  2, 22, 1, DATE '2018-01-02' FROM DUAL UNION ALL
SELECT  3, 33, 0, DATE '2018-01-03' FROM DUAL UNION ALL
SELECT  4, 11, 1, DATE '2018-01-04' FROM DUAL UNION ALL
SELECT  5, 22, 0, DATE '2018-01-05' FROM DUAL UNION ALL
SELECT  6, 33, 1, DATE '2018-01-06' FROM DUAL UNION ALL
SELECT  7, 11, 0, DATE '2018-01-07' FROM DUAL UNION ALL
SELECT  8, 22, 1, DATE '2018-01-08' FROM DUAL UNION ALL
SELECT  9, 33, 0, DATE '2018-01-09' FROM DUAL UNION ALL
SELECT 10, 11, 1, DATE '2018-01-10' FROM DUAL;

查询

SELECT t.*,
       LAG( CASE is_valid WHEN 1 THEN "DATE" END )
         IGNORE NULLS
         OVER ( PARTITION BY client_id ORDER BY "DATE" )
         AS last_valid_session
FROM   test_data t
ORDER BY session_id

输出

SESSION_ID | CLIENT_ID | IS_VALID | DATE | LAST_VALID_SESSION---------:| --------:| -------:| :-------- | :-----------------1 | 11 | 0 | 18年1月1日| null2 | 22 | 1 | 18年1月2日| null3 | 33 | 0 | 18年1月3日| null4 | 11 | 1 | 2018年1月4日| null5 | 22 | 0 | 18年1月5日| 18年1月2日6 | 33 | 1 | 2018年1月6日| null7 | 11 | 0 | 18年1月7日| 2018年1月4日8 | 22 | 1 | 18年1月8日| 18年1月2日9 | 33 | 0 | 18年1月9日| 2018年1月6日10 | 11 | 1 | 18年1月10日| 2018年1月4日

db <>小提琴here

© www.soinside.com 2019 - 2024. All rights reserved.