nPath関数はGreedyパターン マッチングを使用して、パターン内にnongreedy演算子があっても可能な限り最長の一致を検索します。
例えば、link2テーブル入力について検討します。
userid | title | startdate | enddate |
---|---|---|---|
21 | Chief Exec Officer | 1994-10-01 | 2005-02-28 |
21 | Software Engineer | 1996-10-01 | 2001-06-30 |
21 | Software Engineer | 1998-10-01 | 2001-06-30 |
21 | Chief Exec Officer | 2005-03-01 | 2007-03-31 |
21 | Chief Exec Officer | 2007-06-01 | NULL |
以下のクエリーは、下記のテーブルを返します。
SELECT job_transition_path, count(*) AS path_count FROM nPath (
ON link2 PARTITION BY userid ORDER BY startdate
USING
Mode (NONOVERLAPPING)
Pattern ('CEO.ENGR.OTHER*')
Symbols (
job_title like '%Software Eng%' AS ENGR,
TRUE AS OTHER,
job_title like 'Chief Exec Officer' AS CEO
)
Result (accumulate(job_title OF ANY(ENGR,OTHER,CEO)) AS job_transition_path)
) AS dt GROUP BY 1 ORDER BY 2 DESC;
job_transition_path | path_count |
---|---|
[Chief Exec Officer, Software Engineer, Software Engineer, Chief Exec Officer, Chief Exec Officer] | 1 |
このパターンでは、CEOは最初の行、ENGRは2番目の行、OTHER*は残りの行と一致します。
以下のクエリーは、下記のテーブルを返します。
SELECT job_transition_path , count(*) AS path_count FROM nPath (
ON link2 PARTITION BY userid ORDER BY startdate
USING
Mode (NONOVERLAPPING)
Pattern ('CEO.ENGR.OTHER*.CEO')
Symbols (
job_title like '%Software Eng%' AS ENGR,
TRUE AS OTHER,
job_title like 'Chief Exec Officer' AS CEO
)
Result (accumulate(job_title OF ANY(ENGR,OTHER,CEO)) AS job_transition_path)
) AS dt GROUP BY 1 ORDER BY 2 DESC;
job_transition_path | path_count |
---|---|
[Chief Exec Officer, Software Engineer, Software Engineer, Chief Exec Officer, Chief Exec Officer] | 1 |
このパターンでは、CEOは最初の行、ENGRは2番目の行、OTHER*は次の2つの行、そしてCEOは最後の行と一致します。