暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 匹配 _ 识别所需的帮助

askTom 2018-04-12
323

问题描述

亲爱的汤姆先生,

感谢您为支持我们的请求提供的所有帮助和时间。我对匹配识别有一些问题

Oracle版本-12.1.0.2.0
操作系统-REDHAT Linux

CREATE TABLE test_match_recognize(employment_id NUMBER (10, 0) NOT NULL,test_id NUMBER(10), as_of_date DATE NOT NULL
);

INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('2/1/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('2/11/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('3/11/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('3/12/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/21/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('1/3/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('1/6/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('2/3/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('2/5/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('2/7/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('3/10/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/10/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/14/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/16/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/29/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('3/9/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/11/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/15/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('1/8/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('1/31/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/12/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/19/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/24/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/26/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('1/5/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('2/6/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('2/8/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('2/10/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('3/8/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('2/9/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('3/6/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/13/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/18/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/27/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('1/4/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('2/2/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('3/7/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/22/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/23/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/25/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('1/1/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('1/2/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('1/7/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('1/30/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('2/4/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('2/12/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/17/2017','MM/DD/RRRR'));
INSERT INTO test_match_recognize (EMPLOYMENT_ID,TEST_ID,AS_OF_DATE) 
VALUES(1,10,TO_DATE('4/20/2017','MM/DD/RRRR'));
commit;

The following sql is not returning the results in multiple rows as the dates are changing. Please help me 


  SELECT employment_id,
         test_id,
         MIN (d_from) start_date,
         MAX (d_to) end_date,
         ROUND (
             REPLACE (
                   (  TO_DATE (TO_CHAR (MAX (d_to), 'YYYYMMDD'), 'YYYYMMDD')
                    - TO_DATE (TO_CHAR (MIN (d_from), 'YYYYMMDD'), 'YYYYMMDD'))
                 / 7,
                 '-',
                 ''))
             no_of_weeks
    FROM test_match_recognize a MATCH_RECOGNIZE (
                                    PARTITION BY employment_id,
                                                 as_of_date,
                                                 test_id
                                    ORDER BY as_of_date
                                    MEASURES FIRST (as_of_date) d_from,
                                    LAST (as_of_date) d_to
                                    --ALL ROWS PER MATCH
                                    ONE ROW PER MATCH
                                    PATTERN (a b *)
                                    DEFINE b AS (a.test_id = prev (a.test_id)))
   WHERE employment_id = 1 AND test_id = 10
GROUP BY employment_id, test_id

EMPLOYMENT_ID TEST_ID START_DATE END_DATE  NO_OF_WEEKS
------------- ------- ---------- --------- -----------
1             10      1/1/2017   4/29/2017 17
复制


随着日期的分散,预计会有不止一行。

祝你有美好的一天,
感谢和问候
巴斯卡兰·维斯瓦纳坦


专家解答

匹配 _ 识别is返回许多行:

SELECT *
FROM test_match_recognize a match_recognize (
    PARTITION BY employment_id,
                 as_of_date,
                 test_id
    ORDER BY as_of_date
    MEASURES FIRST (as_of_date) d_from,
    LAST (as_of_date) d_to
    --ALL ROWS PER MATCH
    ONE ROW PER MATCH
    PATTERN (a b*)
    DEFINE b AS (a.test_id = prev (a.test_id)))
WHERE employment_id = 1 AND test_id = 10;

EMPLOYMENT_ID   AS_OF_DATE             TEST_ID   D_FROM                 D_TO                   
              1 01-JAN-2017 00:00:00          10 01-JAN-2017 00:00:00   01-JAN-2017 00:00:00   
              1 02-JAN-2017 00:00:00          10 02-JAN-2017 00:00:00   02-JAN-2017 00:00:00   
              1 03-JAN-2017 00:00:00          10 03-JAN-2017 00:00:00   03-JAN-2017 00:00:00   
              1 04-JAN-2017 00:00:00          10 04-JAN-2017 00:00:00   04-JAN-2017 00:00:00   
              1 05-JAN-2017 00:00:00          10 05-JAN-2017 00:00:00   05-JAN-2017 00:00:00   
              1 06-JAN-2017 00:00:00          10 06-JAN-2017 00:00:00   06-JAN-2017 00:00:00   
              1 07-JAN-2017 00:00:00          10 07-JAN-2017 00:00:00   07-JAN-2017 00:00:00   
              1 08-JAN-2017 00:00:00          10 08-JAN-2017 00:00:00   08-JAN-2017 00:00:00   
              1 30-JAN-2017 00:00:00          10 30-JAN-2017 00:00:00   30-JAN-2017 00:00:00   
              1 31-JAN-2017 00:00:00          10 31-JAN-2017 00:00:00   31-JAN-2017 00:00:00   
              1 01-FEB-2017 00:00:00          10 01-FEB-2017 00:00:00   01-FEB-2017 00:00:00   
              1 02-FEB-2017 00:00:00          10 02-FEB-2017 00:00:00   02-FEB-2017 00:00:00   
              1 03-FEB-2017 00:00:00          10 03-FEB-2017 00:00:00   03-FEB-2017 00:00:00   
              1 04-FEB-2017 00:00:00          10 04-FEB-2017 00:00:00   04-FEB-2017 00:00:00   
              1 05-FEB-2017 00:00:00          10 05-FEB-2017 00:00:00   05-FEB-2017 00:00:00   
              1 06-FEB-2017 00:00:00          10 06-FEB-2017 00:00:00   06-FEB-2017 00:00:00   
              1 07-FEB-2017 00:00:00          10 07-FEB-2017 00:00:00   07-FEB-2017 00:00:00   
              1 08-FEB-2017 00:00:00          10 08-FEB-2017 00:00:00   08-FEB-2017 00:00:00   
              1 09-FEB-2017 00:00:00          10 09-FEB-2017 00:00:00   09-FEB-2017 00:00:00   
              1 10-FEB-2017 00:00:00          10 10-FEB-2017 00:00:00   10-FEB-2017 00:00:00   
              1 11-FEB-2017 00:00:00          10 11-FEB-2017 00:00:00   11-FEB-2017 00:00:00   
              1 12-FEB-2017 00:00:00          10 12-FEB-2017 00:00:00   12-FEB-2017 00:00:00   
              1 06-MAR-2017 00:00:00          10 06-MAR-2017 00:00:00   06-MAR-2017 00:00:00   
              1 07-MAR-2017 00:00:00          10 07-MAR-2017 00:00:00   07-MAR-2017 00:00:00   
              1 08-MAR-2017 00:00:00          10 08-MAR-2017 00:00:00   08-MAR-2017 00:00:00   
              1 09-MAR-2017 00:00:00          10 09-MAR-2017 00:00:00   09-MAR-2017 00:00:00   
              1 10-MAR-2017 00:00:00          10 10-MAR-2017 00:00:00   10-MAR-2017 00:00:00   
              1 11-MAR-2017 00:00:00          10 11-MAR-2017 00:00:00   11-MAR-2017 00:00:00   
              1 12-MAR-2017 00:00:00          10 12-MAR-2017 00:00:00   12-MAR-2017 00:00:00   
              1 10-APR-2017 00:00:00          10 10-APR-2017 00:00:00   10-APR-2017 00:00:00   
              1 11-APR-2017 00:00:00          10 11-APR-2017 00:00:00   11-APR-2017 00:00:00   
              1 12-APR-2017 00:00:00          10 12-APR-2017 00:00:00   12-APR-2017 00:00:00   
              1 13-APR-2017 00:00:00          10 13-APR-2017 00:00:00   13-APR-2017 00:00:00   
              1 14-APR-2017 00:00:00          10 14-APR-2017 00:00:00   14-APR-2017 00:00:00   
              1 15-APR-2017 00:00:00          10 15-APR-2017 00:00:00   15-APR-2017 00:00:00   
              1 16-APR-2017 00:00:00          10 16-APR-2017 00:00:00   16-APR-2017 00:00:00   
              1 17-APR-2017 00:00:00          10 17-APR-2017 00:00:00   17-APR-2017 00:00:00   
              1 18-APR-2017 00:00:00          10 18-APR-2017 00:00:00   18-APR-2017 00:00:00   
              1 19-APR-2017 00:00:00          10 19-APR-2017 00:00:00   19-APR-2017 00:00:00   
              1 20-APR-2017 00:00:00          10 20-APR-2017 00:00:00   20-APR-2017 00:00:00   
              1 21-APR-2017 00:00:00          10 21-APR-2017 00:00:00   21-APR-2017 00:00:00   
              1 22-APR-2017 00:00:00          10 22-APR-2017 00:00:00   22-APR-2017 00:00:00   
              1 23-APR-2017 00:00:00          10 23-APR-2017 00:00:00   23-APR-2017 00:00:00   
              1 24-APR-2017 00:00:00          10 24-APR-2017 00:00:00   24-APR-2017 00:00:00   
              1 25-APR-2017 00:00:00          10 25-APR-2017 00:00:00   25-APR-2017 00:00:00   
              1 26-APR-2017 00:00:00          10 26-APR-2017 00:00:00   26-APR-2017 00:00:00   
              1 27-APR-2017 00:00:00          10 27-APR-2017 00:00:00   27-APR-2017 00:00:00   
              1 29-APR-2017 00:00:00          10 29-APR-2017 00:00:00   29-APR-2017 00:00:00 
复制


但你已经按employment_id,test_id分组。并且在输出中只有一个值。因此,一排!

你想在这里做什么?

危险地猜测,您想将具有连续日期的行分组在一起。

这意味着对你的match_regnize子句进行一些严重的返工。

分区子句是:

 PARTITION BY employment_id, as_of_date, test_id
复制


因此,您将为每个as_of_date一行。这是你数据集中的每一行!

沟as_of_date来解决这个问题:

 PARTITION BY employment_id, test_id
复制


但是还有更多问题。模式变量b定义为:

a.test_id = prev (a.test_id)
复制


Test_id在分区by所以组中的所有行都将具有相同的test_id。这意味着这将把行分成两组。一个用于A (这是第一个,总是真实的行)。然后是B。

这是因为prev test_id总是等于电流。除了组中的第一排。它有一个空prev (test_id)。因为没有!

我怀疑你正在寻找的是当前日期 = 前一个日期1的所有行。例如:

as_of_date = prev (as_of_date) + 1)
复制


把它们放在一起,你会得到:

SELECT *
FROM test_match_recognize a 
match_recognize (
    PARTITION BY employment_id, test_id
    ORDER BY as_of_date
    MEASURES FIRST (as_of_date) d_from,
    LAST (as_of_date) d_to,
    match_number() grp
    ONE ROW PER MATCH
    PATTERN (a b*)
    DEFINE b AS (
      as_of_date = prev (as_of_date) + 1
    )
)
WHERE employment_id = 1 AND test_id = 10;

EMPLOYMENT_ID   TEST_ID   D_FROM                 D_TO                   GRP   
              1        10 01-JAN-2017 00:00:00   08-JAN-2017 00:00:00       1 
              1        10 30-JAN-2017 00:00:00   12-FEB-2017 00:00:00       2 
              1        10 06-MAR-2017 00:00:00   12-MAR-2017 00:00:00       3 
              1        10 10-APR-2017 00:00:00   27-APR-2017 00:00:00       4 
              1        10 29-APR-2017 00:00:00   29-APR-2017 00:00:00       5
复制


注意: 没有团体!
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论