<<

Oracle SQL Pattern Matching Made Easy

Oren Nakdimon www.db-oriented.com  [email protected]  +972-54-4393763 @DBoriented © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © MATCH_RECOGNIZE

 Added in Oracle 12cR1  Enhanced analysis of row sequences  For detecting matches to complex patterns  A significant boost to the analytical capabilities of SQL

 Very powerful

With Great Power Comes Complex Syntax © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Agenda

 Start using Pattern Matching

 Step by step

 Not all the capabilities…  But all the essentials (and more)  Simple examples  Recommended resources © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

Who Am I?

http://db-oriented.com © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

YEAR WINNER SONG PERFORMER POINTS LANGUAGE HOST

1956 Refrain Lys Assia French Switzerland 1957 Net als toen Corry Brokken 31 Dutch 1958 Dors, mon amour André Claveau 27 French Netherlands 1959 Netherlands Een beetje Teddy Scholten 21 Dutch France United 1960 France 32 French Kingdom 1961 Nous les amoureux Jean-Claude Pascal 31 French France 1962 France 26 French Luxembourg United 1963 Grethe and Jørgen Ingmann 42 Danish Kingdom 1964 Non ho l'età 49 Italian Denmark Poupée de cire, poupée 1965 Luxembourg de son 32 French Italy 1966 Merci, Chérie Udo Jürgens 31 German Luxembourg United 1967 Kingdom Puppet on a String 47 English Austria United 1968 La, la, la 29 Spanish Kingdom 1969 Netherlands 18 Dutch Spain All Kinds of 1970 Ireland Everything Dana 32 English Netherlands Un banc, un arbre, une 1971 Monaco rue Séverine 128 French Ireland United 1972 Luxembourg Après toi 128 French Kingdom 1973 Luxembourg Tu te reconnaîtras Anne-Marie David 129 French Luxembourg United © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find all the wins of Luxembourg

SELECT * FROM EUROVISION_WINNERS WHERE WINNER = 'Luxembourg'; © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find all the wins of Luxembourg Pattern Variable

YEAR WINNER SONG HOST LUX 1960 France Tom Pillibi 1 1961 Luxembourg Nous les amoureux France  1962 France Un premier amour Luxembourg 1963 Denmark SELECTDansevise YEAR, WINNER, SONG, HOST United Kingdom 1964 Italy FROM EUROVISION_WINNERSNon ho l'età Denmark 2 1965 Luxembourg MATCH_RECOGNIZEPoupée de cire, ( poupée de son Italy  1966 Austria ALL Merci,ROWS PERChérie MATCH Luxembourg 1967 United KingdomPATTERNPuppet ( LUXon )a String Austria 1968 Spain DEFINELa, la,LUX laAS WINNER = 'Luxembourg'United Kingdom 1969 Netherlands) De troubadour Spain 1970 Ireland Netherlands 1971 Monaco Un banc, un arbre, une rue Ireland 3 1972 Luxembourg Après toi United Kingdom  4 1973 Luxembourg Tu te reconnaîtras Luxembourg  1974 Waterloo United Kingdom 1975 Netherlands Ding-a-dong Sweden 1976 United Kingdom Netherlands 1977 France L'oiseau et l'enfant United Kingdom 1978 Israel A-Ba-Ni-Bi France 1979 Israel Hallelujah Israel © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find 2 successive wins of Luxembourg

YEAR WINNER SONG HOST 1960 France Tom Pillibi United Kingdom SELECT * 1961 Luxembourg Nous les amoureux France FROM EUROVISION_WINNERS 1962 France Un premier amour Luxembourg WHERE WINNER = 'Luxembourg'; 1963 Denmark Dansevise United Kingdom 1964 Italy Non ho l'età Denmark 1965 Luxembourg Poupée de cire, poupée de son Italy 1966 Austria Merci, Chérie Luxembourg 1967 United Kingdom Puppet on a String Austria 1968 Spain La, la, la United Kingdom 1969 Netherlands De troubadour Spain 1970 Ireland All Kinds of Everything Netherlands 1971 Monaco Un banc, un arbre, une rue Ireland 1972 Luxembourg Après toi United Kingdom 1973 Luxembourg Tu te reconnaîtras Luxembourg 1974 Sweden Waterloo United Kingdom 1975 Netherlands Ding-a-dong Sweden 1976 United Kingdom Save Your Kisses for Me Netherlands 1977 France L'oiseau et l'enfant United Kingdom 1978 Israel A-Ba-Ni-Bi France 1979 Israel Hallelujah Israel © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find 2 successive wins of Luxembourg Pattern order by Variable

YEAR WINNER SONG HOST LUX 1960 France Tom Pillibi United Kingdom 1961 Luxembourg Nous les amoureux France  1962 France Un premier amour Luxembourg 1963 Denmark SELECTDansevise YEAR, WINNER, SONG, HOST United Kingdom 1964 Italy FROM EUROVISION_WINNERSNon ho l'età Denmark 1965 Luxembourg MATCH_RECOGNIZEPoupée de cire, ( poupée de son Italy  1966 Austria ORDERMerci, BY YEARChérie Luxembourg 1967 United KingdomALL PuppetROWS PERon aMATCH String Austria 1968 Spain PATTERNLa, la, (LUX la LUX) United Kingdom 1969 Netherlands DEFINEDe troubadour LUX AS WINNER = 'Luxembourg'Spain 1970 Ireland ) All Kinds of Everything Netherlands 1971 Monaco Un banc, un arbre, une rue Ireland 1 1972 Luxembourg Après toi United Kingdom  1973 Luxembourg Tu te reconnaîtras Luxembourg  1974 Sweden Waterloo United Kingdom 1975 Netherlands Ding-a-dong Sweden 1976 United Kingdom Save Your Kisses for Me Netherlands 1977 France L'oiseau et l'enfant United Kingdom 1978 Israel A-Ba-Ni-Bi France 1979 Israel Hallelujah Israel © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

Variables Pattern © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find 2 successive wins of Luxembourg Pattern order by Variable

YEAR WINNER SONG HOST LUX 1960 France Tom Pillibi United Kingdom 1961 Luxembourg Nous les amoureux France 1962 France Un premier amour Luxembourg 1963 Denmark SELECTDansevise YEAR, WINNER, SONG, HOST United Kingdom 1964 Italy FROM EUROVISION_WINNERSNon ho l'età Denmark 1965 Luxembourg MATCH_RECOGNIZEPoupée de cire, ( poupée de son Italy 1966 Austria ORDERMerci, BY YEARChérie Luxembourg 1967 United KingdomALL PuppetROWS PERon aMATCH String Austria 1968 Spain PATTERNLa, la, (LUX la LUX) United Kingdom 1969 Netherlands DEFINEDe troubadour LUX AS WINNER = 'Luxembourg'Spain 1970 Ireland ) All Kinds of Everything Netherlands 1971 Monaco Un banc, un arbre, une rue Ireland 1 1972 Luxembourg Après toi United Kingdom  1973 Luxembourg Tu te reconnaîtras Luxembourg  1974 Sweden Waterloo United Kingdom 1975 Netherlands Ding-a-dong Sweden 1976 United Kingdom Save Your Kisses for Me Netherlands 1977 France L'oiseau et l'enfant United Kingdom 1978 Israel A-Ba-Ni-Bi France 1979 Israel Hallelujah Israel © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find 2 successive wins of Luxembourg

SELECT YEAR, WINNER, SONG, HOST FROM EUROVISION_WINNERS MATCH_RECOGNIZE ( ORDER BY YEAR ALL ROWS PER MATCH PATTERN (LUX LUX) DEFINE LUX AS WINNER = 'Luxembourg' ) © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find 2 successive wins of Luxembourg

SELECT YEAR, WINNER, SONG, HOST FROM EUROVISION_WINNERS MATCH_RECOGNIZE ( ORDER BY YEAR ALL ROWS PER MATCH PATTERN (LUX{2}) DEFINE LUX AS WINNER = 'Luxembourg' ) © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © PATTERN Quantifiers

Pattern Number of consecutive occurrences X 1 X{n} n X{n,} n or more X{n,m} between n and m X{,m} between 0 and m X* 0 or more X? 0 or 1 X+ 1 or more © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find one or more successive wins of Luxembourg Pattern order by Variable

YEAR WINNER SONG HOST LUX 1960 France Tom Pillibi United Kingdom 1 1961 Luxembourg Nous les amoureux France  1962 France Un premier amour Luxembourg 1963 Denmark SELECTDansevise YEAR, WINNER, SONG, HOST United Kingdom 1964 Italy FROM EUROVISION_WINNERSNon ho l'età Denmark 2 1965 Luxembourg MATCH_RECOGNIZEPoupée de cire, ( poupée de son Italy  1966 Austria ORDERMerci, BY YEARChérie Luxembourg 1967 United KingdomALL PuppetROWS PERon aMATCH String Austria 1968 Spain PATTERNLa, la, (LUX+ la ) United Kingdom 1969 Netherlands DEFINEDe troubadour LUX AS WINNER = 'Luxembourg'Spain 1970 Ireland ) All Kinds of Everything Netherlands 1971 Monaco Un banc, un arbre, une rue Ireland 3 1972 Luxembourg Après toi United Kingdom  1973 Luxembourg Tu te reconnaîtras Luxembourg  1974 Sweden Waterloo United Kingdom 1975 Netherlands Ding-a-dong Sweden 1976 United Kingdom Save Your Kisses for Me Netherlands 1977 France L'oiseau et l'enfant United Kingdom 1978 Israel A-Ba-Ni-Bi France 1979 Israel Hallelujah Israel © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

SELECT YEAR, WINNER, SONG, HOST SELECT YEAR, WINNER, SONG, HOST FROM EUROVISION_WINNERS FROM EUROVISION_WINNERS MATCH_RECOGNIZE ( MATCH_RECOGNIZE ( ORDER BY YEAR ORDER BY YEAR ALL ROWS PER MATCH ALL ROWS PER MATCH PATTERN (LUX) PATTERN (LUX+) DEFINE LUX AS WINNER = 'Luxembourg' DEFINE LUX AS WINNER = 'Luxembourg' ) ) © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

A match is a consecutive sequence of (zero, one, or more) records, that matches a specific pattern © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © SELECT YEAR, WINNER, SONG, HOST SELECT YEAR, WINNER, SONG, HOST FROM EUROVISION_WINNERS FROM EUROVISION_WINNERS MATCH_RECOGNIZE ( MATCH_RECOGNIZE ( ORDER BY YEAR ORDER BY YEAR MEASURES MEASURES MATCH_NUMBER() AS MATCH# MATCH_NUMBER() AS MATCH# ALL ROWS PER MATCH ALL ROWS PER MATCH PATTERN (LUX) PATTERN (LUX+) DEFINE LUX AS WINNER = 'Luxembourg' DEFINE LUX AS WINNER = 'Luxembourg' ) ) © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © SELECT MATCH#, YEAR, WINNER, SONG, HOST SELECT MATCH#, YEAR, WINNER, SONG, HOST FROM EUROVISION_WINNERS FROM EUROVISION_WINNERS MATCH_RECOGNIZE ( MATCH_RECOGNIZE ( ORDER BY YEAR ORDER BY YEAR MEASURES MEASURES MATCH_NUMBER() AS MATCH# MATCH_NUMBER() AS MATCH# ALL ROWS PER MATCH ALL ROWS PER MATCH PATTERN (LUX) PATTERN (LUX+) DEFINE LUX AS WINNER = 'Luxembourg' DEFINE LUX AS WINNER = 'Luxembourg' ) ) © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

MATCH_RECOGNIZE © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Input and Output

SELECT * FROM (SELECT YEAR, WINNER, SONG, PERFORMER, HOST FROM EUROVISION_WINNERS WHERE YEAR BETWEEN 1990 AND 2000) MATCH_RECOGNIZE ( ORDER BY YEAR MEASURES MATCH_NUMBER() AS MATCH# ALL ROWS PER MATCH PATTERN (I L UK?) DEFINE I AS WINNER LIKE 'I%', LN AS LENGTH(SONG)>=18, UK AS HOST='United Kingdom' ); © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Input and Output

SELECT * FROM (SELECT YEAR, WINNER, SONG, PERFORMER, HOST FROM EUROVISION_WINNERS WHERE YEAR BETWEEN 1990 AND 2000) MATCH_RECOGNIZE ( ORDER BY YEAR MEASURES MATCH_NUMBER() AS MATCH# ALL ROWS PER MATCH PATTERN (I L UK?) DEFINE I AS WINNER LIKE 'I%', LN AS LENGTH(SONG)>=18, UK AS HOST='United Kingdom' ); © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Input and Output

SELECT * FROM (SELECT YEAR, WINNER, SONG, HOST FROM EUROVISION_WINNERS WHERE YEAR BETWEEN 1990 AND 2000) MATCH_RECOGNIZE ( ORDER BY YEAR MEASURES MATCH_NUMBER() AS MATCH# ALL ROWS PER MATCH PATTERN (I L UK?) DEFINE I AS WINNER LIKE 'I%', LN AS LENGTH(SONG)>=18, UK AS HOST='United Kingdom' ); © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Input and Output

YEAR WINNER SONG HOST 1990 Italy Insieme: 1992 Yugoslavia 1991 Sweden Fångad av en stormvind Italy 1992 IrelandSELECT * FROM Why Me? Sweden 1993 Ireland(SELECT YEAR, InWINNER, Your EyesSONG, HOST Ireland 1994 IrelandFROM EUROVISION_WINNERSRock 'n' Roll Kids Ireland 1995 NorwayWHERE YEAR BETWEENNocturne 1990 AND 2000) Ireland 1996 IrelandMATCH_RECOGNIZEThe ( 1997 UnitedORDER Kingdom BY YEARLove Shine a Light Ireland 1998 IsraelMEASURES Diva United Kingdom 1999 SwedenMATCH_NUMBER()Take MeAS toMATCH# Your Heaven Israel 2000 DenmarkALL ROWS PERFly MATCH on the Wings of Love Sweden PATTERN (I L UK?) DEFINE I AS WINNER LIKE 'I%', LN AS LENGTH(SONG)>=18, UK AS HOST='United Kingdom' ); © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Multiple Pattern Variables order by

YEAR WINNER SONG HOST 1990 Italy Insieme: 1992 Yugoslavia 1991 Sweden Fångad av en stormvind Italy 1992 IrelandSELECT * FROM Why Me? Sweden 1993 Ireland(SELECT YEAR, InWINNER, Your EyesSONG, HOST Ireland 1994 IrelandFROM EUROVISION_WINNERSRock 'n' Roll Kids Ireland 1995 NorwayWHERE YEAR BETWEENNocturne 1990 AND 2000) Ireland 1996 IrelandMATCH_RECOGNIZEThe ( Voice Norway 1997 UnitedORDER Kingdom BY YEARLove Shine a Light Ireland 1998 IsraelMEASURES Diva United Kingdom 1999 SwedenMATCH_NUMBER()Take MeAS toMATCH# Your Heaven Israel 2000 DenmarkALL ROWS PERFly MATCH on the Wings of Love Sweden PATTERN (I LN UK?) DEFINE I AS WINNER LIKE 'I%', LN AS LENGTH(SONG)>=18, UK AS HOST='United Kingdom' ); © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Multiple Pattern Variables order by

YEAR WINNER SONG HOST 1990 Italy Insieme: 1992 Yugoslavia 1991 Sweden Fångad av en stormvind Italy 1992 IrelandSELECT * FROM Why Me? Sweden 1993 Ireland(SELECT YEAR, InWINNER, Your EyesSONG, PERFORMER, HOSTIreland 1994 IrelandFROM EUROVISION_WINNERSRock 'n' Roll Kids Ireland 1995 NorwayWHERE YEAR BETWEENNocturne 1990 AND 2000) Ireland 1996 IrelandMATCH_RECOGNIZEThe ( Voice Norway 1997 UnitedORDER Kingdom BY YEARLove Shine a Light Ireland 1998 IsraelMEASURES Diva United Kingdom 1999 SwedenMATCH_NUMBER()Take MeAS toMATCH# Your Heaven Israel 2000 DenmarkALL ROWS PERFly MATCH on the Wings of Love Sweden PATTERN (I LN UK?) DEFINE I AS WINNER LIKE 'I%', LN AS LENGTH(SONG)>=18, UK AS HOST='United Kingdom' ); © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

Multiple Pattern Variables Pattern order by Variables

YEAR WINNER SONG HOST I 1990 Italy Insieme: 1992 Yugoslavia ? 1991 Sweden Fångad av en stormvind Italy 1992 IrelandSELECT * FROM Why Me? Sweden ? 1993 Ireland(SELECT YEAR, InWINNER, Your EyesSONG, PERFORMER, HOSTIreland ? 1994 IrelandFROM EUROVISION_WINNERSRock 'n' Roll Kids Ireland ? 1995 NorwayWHERE YEAR BETWEENNocturne 1990 AND 2000) Ireland 1996 IrelandMATCH_RECOGNIZEThe ( Voice Norway ? 1997 UnitedORDER Kingdom BY YEARLove Shine a Light Ireland 1998 IsraelMEASURES Diva United Kingdom ? 1999 SwedenMATCH_NUMBER()Take MeAS toMATCH# Your Heaven Israel 2000 DenmarkALL ROWS PERFly MATCH on the Wings of Love Sweden PATTERN (I LN UK?) DEFINE I AS WINNER LIKE 'I%', LN AS LENGTH(SONG)>=18, UK AS HOST='United Kingdom' ); © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

Multiple Pattern Variables Pattern order by Variables

YEAR WINNER SONG HOST I LN 1990 Italy Insieme: 1992 Yugoslavia ? 1991 Sweden Fångad av en stormvind Italy ? 1992 IrelandSELECT * FROM Why Me? Sweden ? 1993 Ireland(SELECT YEAR, InWINNER, Your EyesSONG, PERFORMER, HOSTIreland ? 1994 IrelandFROM EUROVISION_WINNERSRock 'n' Roll Kids Ireland ? ? 1995 NorwayWHERE YEAR BETWEENNocturne 1990 AND 2000) Ireland 1996 IrelandMATCH_RECOGNIZEThe ( Voice Norway ? 1997 UnitedORDER Kingdom BY YEARLove Shine a Light Ireland ? 1998 IsraelMEASURES Diva United Kingdom ? 1999 SwedenMATCH_NUMBER()Take MeAS toMATCH# Your Heaven Israel ? 2000 DenmarkALL ROWS PERFly MATCH on the Wings of Love Sweden ? PATTERN (I LN UK?) DEFINE I AS WINNER LIKE 'I%', LN AS LENGTH(SONG)>=18, UK AS HOST='United Kingdom' ); © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

Multiple Pattern Variables Pattern order by Variables

YEAR WINNER SONG HOST I LN UK 1990 Italy Insieme: 1992 Yugoslavia ? 1991 Sweden Fångad av en stormvind Italy ? 1992 IrelandSELECT * FROM Why Me? Sweden ? 1993 Ireland(SELECT YEAR, InWINNER, Your EyesSONG, PERFORMER, HOSTIreland ? 1994 IrelandFROM EUROVISION_WINNERSRock 'n' Roll Kids Ireland ? ? 1995 NorwayWHERE YEAR BETWEENNocturne 1990 AND 2000) Ireland 1996 IrelandMATCH_RECOGNIZEThe ( Voice Norway ? 1997 UnitedORDER Kingdom BY YEARLove Shine a Light Ireland ? 1998 IsraelMEASURES Diva United Kingdom ? ? 1999 SwedenMATCH_NUMBER()Take MeAS toMATCH# Your Heaven Israel ? 2000 DenmarkALL ROWS PERFly MATCH on the Wings of Love Sweden ? PATTERN (I LN UK?) DEFINE I AS WINNER LIKE 'I%', LN AS LENGTH(SONG)>=18, UK AS HOST='United Kingdom' ); © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

Multiple Pattern Variables Pattern order by Variables

YEAR WINNER SONG HOST I LN UK 1990 Italy Insieme: 1992 Yugoslavia  1 1991 Sweden Fångad av en stormvind Italy  1992 IrelandSELECT * FROM Why Me? Sweden  1993 Ireland(SELECT YEAR, InWINNER, Your EyesSONG, PERFORMER, HOSTIreland  2 1994 IrelandFROM EUROVISION_WINNERSRock 'n' Roll Kids Ireland  1995 NorwayWHERE YEAR BETWEENNocturne 1990 AND 2000) Ireland 1996 IrelandMATCH_RECOGNIZEThe ( Voice Norway  3 1997 UnitedORDER Kingdom BY YEARLove Shine a Light Ireland  1998 IsraelMEASURES Diva United Kingdom  1999 SwedenMATCH_NUMBER()Take MeAS toMATCH# Your Heaven Israel 2000 DenmarkALL ROWS PERFly MATCH on the Wings of Love Sweden PATTERN (I LN UK?) DEFINE I AS WINNER LIKE 'I%', LN AS LENGTH(SONG)>=18, UK AS HOST='United Kingdom' ); © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

Multiple Pattern Variables Pattern order by Variables

YEAR WINNER SONG HOST I LN UK 1990 Italy Insieme: 1992 Yugoslavia  1 1991 Sweden Fångad av en stormvind Italy  1992 IrelandSELECT * FROM Why Me? Sweden  1993 Ireland(SELECT YEAR, InWINNER, Your EyesSONG, HOST Ireland  2 1994 IrelandFROM EUROVISION_WINNERSRock 'n' Roll Kids Ireland  1995 NorwayWHERE YEAR BETWEENNocturne 1990 AND 2000) Ireland 1996 IrelandMATCH_RECOGNIZEThe ( Voice Norway  3 1997 UnitedORDER Kingdom BY YEARLove Shine a Light Ireland  1998 IsraelMEASURES Diva United Kingdom  1999 SwedenMATCH_NUMBER()Take MeAS toMATCH# Your Heaven Israel 2000 DenmarkALL ROWS PERFly MATCH on the Wings of Love Sweden PATTERN (I LN UK?) DEFINE I AS WINNER LIKE 'I%', LN AS LENGTH(SONG)>=18, UK AS HOST='United Kingdom' ); © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

Implicit Pattern Find two or more successive wins of the same country Variable

YEAR WINNER SONG HOST X SAME 1977 France L'oiseau et l'enfant United Kingdom PREV 1978 Israel A-Ba-Ni-Bi France NEXT 1979 Israel Hallelujah Israel  1980 Ireland What's Another Year Netherlands  1981 United Kingdom MakingSELECT Your MindMATCH#, Up YEAR, WINNER,Ireland SONG, HOST  1982 Germany Ein bißchenFROM EUROVISION_WINNERSFrieden United Kingdom  1983 Luxembourg Si la MATCH_RECOGNIZEvie est cadeau ( Germany  1984 Sweden Diggi-LooORDER Diggi BY- LeyYEAR Luxembourg  1985 Norway La det swingeMEASURES Sweden  1986 Belgium J'aime la MATCH_NUMBER()vie AS NorwayMATCH#  1987 Ireland Hold Me ALLNow ROWS PER MATCH Belgium  1988 Switzerland Ne partezPATTERN pas sans (X SAME+moi ) Ireland  1989 Yugoslavia Rock MeDEFINE SAME AS WINNERSwitzerland = PREV(WINNER)  1990 Italy Insieme);: 1992 Yugoslavia  1991 Sweden Fångad av en stormvind Italy  1992 Ireland Why Me? Sweden  1993 Ireland In Your Eyes Ireland  1994 Ireland Rock 'n' Roll Kids Ireland  1995 Norway Nocturne Ireland © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find returning winners after a break YEAR WINNER SONG POINTS 1971 Monaco Un banc, un arbre, une rue 128 1972 Luxembourg Après toi 128 1973 Luxembourg Tu te reconnaîtras 129 1974 Sweden Waterloo 24 1975 Netherlands Ding-a-dong 152 1976 United Kingdom Save Your Kisses for Me 164 1977 France L'oiseau et l'enfant 136 1978 Israel A-Ba-Ni-Bi 157 1979 Israel Hallelujah 125 1980 Ireland What's Another Year 143 1981 United Kingdom 136 1982 Germany Ein bißchen Frieden 161 1983 Luxembourg Si la vie est cadeau 142 1984 Sweden Diggi-Loo Diggi-Ley 145 1985 Norway La det swinge 123 1986 Belgium J'aime la vie 176 1987 Ireland Hold Me Now 172 1988 Switzerland 137 1989 Yugoslavia Rock Me 137 1990 Italy Insieme: 1992 149 1991 Sweden Fångad av en stormvind 146 © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find returning winners after a break YEAR WINNER SONG POINTS 1971 Monaco Un banc, un arbre, une rue 128 1972 Luxembourg Après SELECTtoi MATCH#, YEAR, WINNER,128 SONG, POINTS, CLS 1973 Luxembourg Tu te FROMreconnaîtras (SELECT * FROM EUROVISION_WINNERS129 1974 Sweden Waterloo WHERE YEAR BETWEEN24 1971 AND 1991) 1975 Netherlands Ding-aMATCH_RECOGNIZE-dong ( 152 1976 United Kingdom Save YourORDER Kisses BY YEARfor Me 164 1977 France L'oiseauMEASURES et l'enfant 136 1978 Israel A-Ba-Ni-Bi 157 MATCH_NUMBER() MATCH#, 1979 Israel Hallelujah 125 CLASSIFIER() CLS 1980 Ireland What's Another Year 143 ALL ROWS PER MATCH 1981 United Kingdom Making Your Mind Up 136 AFTER MATCH SKIP PAST LAST ROW 1982 Germany Ein bißchen Frieden 161 PATTERN (A SAME* DIFF+ LIKE_FIRST+) 1983 Luxembourg Si la vie est cadeau 142 DEFINE 1984 Sweden Diggi-Loo Diggi-Ley 145 1985 Norway La det swingeSAME AS WINNER = PREV(WINNER),123 1986 Belgium J'aime la DIFFvie AS WINNER != 176A.WINNER, 1987 Ireland Hold Me NowLIKE_FIRST AS WINNER172 = A.WINNER 1988 Switzerland Ne partez) pas sans moi 137 1989 Yugoslavia Rock MeORDER BY YEAR; 137 1990 Italy Insieme: 1992 149 1991 Sweden Fångad av en stormvind 146 © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find returning winners after a break YEAR WINNER SONG POINTS 1971 Monaco Un banc, un arbre, une rue 128 1972 Luxembourg Après SELECTtoi MATCH#, YEAR, WINNER,128 SONG, POINTS, CLS 1973 Luxembourg Tu te FROMreconnaîtras (SELECT * FROM EUROVISION_WINNERS129 1974 Sweden Waterloo WHERE YEAR BETWEEN24 1971 AND 1991) 1975 Netherlands Ding-aMATCH_RECOGNIZE-dong ( 152 1976 United Kingdom Save YourORDER Kisses BY YEARfor Me 164 1977 France L'oiseauMEASURES et l'enfant 136 1978 Israel A-Ba-Ni-Bi 157 MATCH_NUMBER() MATCH#, 1979 Israel Hallelujah 125 CLASSIFIER() CLS 1980 Ireland What's Another Year 143 ALL ROWS PER MATCH 1981 United Kingdom Making Your Mind Up 136 AFTER MATCH SKIP PAST LAST ROW 1982 Germany Ein bißchen Frieden 161 PATTERN (A SAME* DIFF+ LIKE_FIRST+) 1983 Luxembourg Si la vie est cadeau 142 DEFINE 1984 Sweden Diggi-Loo Diggi-Ley 145 1985 Norway La det swingeSAME AS WINNER = PREV(WINNER),123 1986 Belgium J'aime la DIFFvie AS WINNER != 176A.WINNER, 1987 Ireland Hold Me NowLIKE_FIRST AS WINNER172 = A.WINNER 1988 Switzerland Ne partez) pas sans moi 137 1989 Yugoslavia Rock MeORDER BY YEAR; 137 1990 Italy Insieme: 1992 149 1991 Sweden Fångad av en stormvind 146 © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find returning winners after a break YEAR WINNER SONG POINTS 1971 Monaco Un banc, un arbre, une rue 128 1972 Luxembourg Après SELECTtoi MATCH#, YEAR, WINNER,128 SONG, POINTS, CLS 1973 Luxembourg Tu te FROMreconnaîtras (SELECT * FROM EUROVISION_WINNERS129 1974 Sweden Waterloo WHERE YEAR BETWEEN24 1971 AND 1991) 1975 Netherlands Ding-aMATCH_RECOGNIZE-dong ( 152 1976 United Kingdom Save YourORDER Kisses BY YEARfor Me 164 1977 France L'oiseauMEASURES et l'enfant 136 1978 Israel A-Ba-Ni-Bi 157 MATCH_NUMBER() MATCH#, 1979 Israel Hallelujah 125 CLASSIFIER() CLS 1980 Ireland What's Another Year 143 ALL ROWS PER MATCH 1981 United Kingdom Making Your Mind Up 136 AFTER MATCH SKIP PAST LAST ROW 1982 Germany Ein bißchen Frieden 161 PATTERN (A SAME* DIFF+ LIKE_FIRST+) 1983 Luxembourg Si la vie est cadeau 142 DEFINE 1984 Sweden Diggi-Loo Diggi-Ley 145 1985 Norway La det swingeSAME AS WINNER = PREV(WINNER)123 , 1986 Belgium J'aime la DIFFvie AS WINNER != 176A.WINNER, 1987 Ireland Hold Me NowLIKE_FIRST AS WINNER172 = A.WINNER 1988 Switzerland Ne partez) pas sans moi 137 1989 Yugoslavia Rock MeORDER BY YEAR; 137 1990 Italy Insieme: 1992 149 1991 Sweden Fångad av en stormvind 146 © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find returning winners after a break YEAR WINNER SONG POINTS 1971 Monaco Un banc, un arbre, une rue 128 1972 Luxembourg Après SELECTtoi MATCH#, YEAR, WINNER,128 SONG, POINTS, CLS 1973 Luxembourg Tu te FROMreconnaîtras (SELECT * FROM EUROVISION_WINNERS129 1974 Sweden Waterloo WHERE YEAR BETWEEN24 1971 AND 1991) 1975 Netherlands Ding-aMATCH_RECOGNIZE-dong ( 152 1976 United Kingdom Save YourORDER Kisses BY YEARfor Me 164 1977 France L'oiseauMEASURES et l'enfant 136 1978 Israel A-Ba-Ni-Bi 157 MATCH_NUMBER() MATCH#, 1979 Israel Hallelujah 125 CLASSIFIER() CLS 1980 Ireland What's Another Year 143 ALL ROWS PER MATCH 1981 United Kingdom Making Your Mind Up 136 AFTER MATCH SKIP PAST LAST ROW 1982 Germany Ein bißchen Frieden 161 PATTERN (A SAME* DIFF+ LIKE_FIRST+) 1983 Luxembourg Si la vie est cadeau 142 DEFINE 1984 Sweden Diggi-Loo Diggi-Ley 145 1985 Norway La det swingeSAME AS WINNER = PREV(WINNER),123 1986 Belgium J'aime la DIFFvie AS WINNER != 176A.WINNER, 1987 Ireland Hold Me NowLIKE_FIRST AS WINNER172 = A.WINNER 1988 Switzerland Ne partez) pas sans moi 137 1989 Yugoslavia Rock MeORDER BY YEAR; 137 1990 Italy Insieme: 1992 149 1991 Sweden Fångad av en stormvind 146 © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find returning winners after a break YEAR WINNER SONG POINTS 1971 Monaco Un banc, un arbre, une rue 128 1972 Luxembourg Après SELECTtoi MATCH#, YEAR, WINNER,128 SONG, POINTS, CLS 1973 Luxembourg Tu te FROMreconnaîtras (SELECT * FROM EUROVISION_WINNERS129 1974 Sweden Waterloo WHERE YEAR BETWEEN24 1971 AND 1991) 1975 Netherlands Ding-aMATCH_RECOGNIZE-dong ( 152 1976 United Kingdom Save YourORDER Kisses BY YEARfor Me 164 1977 France L'oiseauMEASURES et l'enfant 136 1978 Israel A-Ba-Ni-Bi 157 MATCH_NUMBER() MATCH#, 1979 Israel Hallelujah 125 CLASSIFIER() CLS 1980 Ireland What's Another Year 143 ALL ROWS PER MATCH 1981 United Kingdom Making Your Mind Up 136 AFTER MATCH SKIP PAST LAST ROW 1982 Germany Ein bißchen Frieden 161 PATTERN (A SAME* DIFF+ LIKE_FIRST+) 1983 Luxembourg Si la vie est cadeau 142 DEFINE 1984 Sweden Diggi-Loo Diggi-Ley 145 1985 Norway La det swingeSAME AS WINNER = PREV(WINNER),123 1986 Belgium J'aime la DIFFvie AS WINNER != 176A.WINNER, 1987 Ireland Hold Me NowLIKE_FIRST AS WINNER172 = A.WINNER 1988 Switzerland Ne partez) pas sans moi 137 1989 Yugoslavia Rock MeORDER BY YEAR; 137 1990 Italy Insieme: 1992 149 1991 Sweden Fångad av en stormvind 146 © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find returning winners after a break YEAR WINNER SONG POINTS 1971 Monaco Un banc, un arbre, une rue 128 1972 Luxembourg Après SELECTtoi MATCH#, YEAR, WINNER,128 SONG, POINTS, CLS 1973 Luxembourg Tu te FROMreconnaîtras (SELECT * FROM EUROVISION_WINNERS129 1974 Sweden Waterloo WHERE YEAR BETWEEN24 1971 AND 1991) 1975 Netherlands Ding-aMATCH_RECOGNIZE-dong ( 152 1976 United Kingdom Save YourORDER Kisses BY YEARfor Me 164 1977 France L'oiseauMEASURES et l'enfant 136 1978 Israel A-Ba-Ni-Bi 157 MATCH_NUMBER() MATCH#, 1979 Israel Hallelujah 125 CLASSIFIER() CLS 1980 Ireland What's Another Year 143 ALL ROWS PER MATCH 1981 United Kingdom Making Your Mind Up 136 AFTER MATCH SKIP PAST LAST ROW 1982 Germany Ein bißchen Frieden 161 PATTERN (A SAME* DIFF+ LIKE_FIRST+) 1983 Luxembourg Si la vie est cadeau 142 DEFINE 1984 Sweden Diggi-Loo Diggi-Ley 145 1985 Norway La det swingeSAME AS WINNER = PREV(WINNER),123 1986 Belgium J'aime la DIFFvie AS WINNER != 176A.WINNER, 1987 Ireland Hold Me NowLIKE_FIRST AS WINNER172 = A.WINNER 1988 Switzerland Ne partez) pas sans moi 137 1989 Yugoslavia Rock MeORDER BY YEAR; 137 1990 Italy Insieme: 1992 149 1991 Sweden Fångad av en stormvind 146 © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find returning winners after a break YEAR WINNER SONG POINTS 1971 Monaco Un banc, un arbre, une rue 128 1972 Luxembourg Après SELECTtoi MATCH#, YEAR, WINNER,128 SONG, POINTS, CLS 1973 Luxembourg Tu te FROMreconnaîtras (SELECT * FROM EUROVISION_WINNERS129 1974 Sweden Waterloo WHERE YEAR BETWEEN24 1971 AND 1991) 1975 Netherlands Ding-aMATCH_RECOGNIZE-dong ( 152 1976 United Kingdom Save YourORDER Kisses BY YEARfor Me 164 1977 France L'oiseauMEASURES et l'enfant 136 1978 Israel A-Ba-Ni-Bi 157 MATCH_NUMBER() MATCH#, 1979 Israel Hallelujah 125 CLASSIFIER() CLS 1980 Ireland What's Another Year 143 ALL ROWS PER MATCH 1981 United Kingdom Making Your Mind Up 136 AFTER MATCH SKIP PAST LAST ROW 1982 Germany Ein bißchen Frieden 161 PATTERN (A SAME* DIFF+ LIKE_FIRST+) 1983 Luxembourg Si la vie est cadeau 142 DEFINE 1984 Sweden Diggi-Loo Diggi-Ley 145 1985 Norway La det swingeSAME AS WINNER = PREV(WINNER),123 1986 Belgium J'aime la DIFFvie AS WINNER != 176A.WINNER, 1987 Ireland Hold Me NowLIKE_FIRST AS WINNER172 = A.WINNER 1988 Switzerland Ne partez) pas sans moi 137 1989 Yugoslavia Rock MeORDER BY YEAR; 137 1990 Italy Insieme: 1992 149 1991 Sweden Fångad av en stormvind 146 © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Find returning winners after a break

SELECT MATCH#, YEAR, WINNER, SONG, POINTS, CLS FROM (SELECT * FROM EUROVISION_WINNERS WHERE YEAR BETWEEN 1971 AND 1991) MATCH_RECOGNIZE ( ORDER BY YEAR MEASURES MATCH_NUMBER() MATCH#, CLASSIFIER() CLS ALL ROWS PER MATCH AFTER MATCH SKIP PAST LAST ROW PATTERN (A SAME* DIFF+ LIKE_FIRST+) DEFINE SAME AS WINNER = PREV(WINNER), DIFF AS WINNER != A.WINNER, LIKE_FIRST AS WINNER = A.WINNER ) ORDER BY YEAR; © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

SELECT MATCH#, YEAR, WINNER, SONG, POINTS, CLS FROM (SELECT * FROM EUROVISION_WINNERS WHERE YEAR BETWEEN 1971 AND 1991) MATCH_RECOGNIZE ( ORDER BY YEAR MEASURES MATCH_NUMBER() MATCH#, CLASSIFIER() CLS ALL ROWS PER MATCH AFTER MATCH SKIP PAST LAST ROW PATTERN (A SAME* DIFF+ LIKE_FIRST+) DEFINE SAME AS WINNER = PREV(WINNER), DIFF AS WINNER != A.WINNER, LIKE_FIRST AS WINNER = A.WINNER ) ORDER BY YEAR; © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

SELECT MATCH#, YEAR, WINNER, SONG, POINTS, VAR FROM (SELECT * FROM EUROVISION_WINNERS WHERE YEAR BETWEEN 1971 AND 1991) MATCH_RECOGNIZE ( ORDER BY YEAR MEASURES MATCH_NUMBER() MATCH#, CLASSIFIER() VAR ALL ROWS PER MATCH AFTER MATCH SKIP PAST LAST ROW PATTERN (A SAME* DIFF+ LIKE_FIRST+) DEFINE SAME AS WINNER = PREV(WINNER), DIFF AS WINNER != A.WINNER, LIKE_FIRST AS WINNER = A.WINNER ) ORDER BY YEAR; © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

SELECT MATCH#, YEAR, WINNER, SONG, POINTS, VAR FROM (SELECT * FROM EUROVISION_WINNERS WHERE YEAR BETWEEN 1971 AND 1991) MATCH_RECOGNIZE ( ORDER BY YEAR MEASURES MATCH_NUMBER() MATCH#, CLASSIFIER() VAR ALL ROWS PER MATCH WITH UNMATCHED ROWS AFTER MATCH SKIP PAST LAST ROW PATTERN (A SAME* DIFF+ LIKE_FIRST+) DEFINE SAME AS WINNER = PREV(WINNER), DIFF AS WINNER != A.WINNER, LIKE_FIRST AS WINNER = A.WINNER ) ORDER BY YEAR; © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

SELECT MATCH#, YEAR, WINNER, SONG, POINTS, VAR FROM (SELECT * FROM EUROVISION_WINNERS WHERE YEARPAST BETWEENLAST ROW 1971 (the AND default) 1991) MATCH_RECOGNIZETO NEXT( ROW ORDER BY YEARTO FIRST var MEASURES TO [LAST] var MATCH_NUMBER() MATCH#, CLASSIFIER() VAR ALL ROWS PER MATCH WITH UNMATCHED ROWS AFTER MATCH SKIP PAST LAST ROW PATTERN (A SAME* DIFF+ LIKE_FIRST+) DEFINE SAME AS WINNER = PREV(WINNER), DIFF AS WINNER != A.WINNER, LIKE_FIRST AS WINNER = A.WINNER ) ORDER BY YEAR; © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

SELECT MATCH#, YEAR, WINNER, SONG, POINTS, VAR FROM (SELECT * FROM EUROVISION_WINNERS WHERE YEAR BETWEEN 1971 AND 1991) MATCH_RECOGNIZE ( ORDER BY YEAR MEASURES MATCH_NUMBER() MATCH#, CLASSIFIER() VAR ALL ROWS PER MATCH WITH UNMATCHED ROWS AFTER MATCH SKIP TO FIRST DIFF PATTERN (A SAME* DIFF+ LIKE_FIRST+) DEFINE SAME AS WINNER = PREV(WINNER), DIFF AS WINNER != A.WINNER, LIKE_FIRST AS WINNER = A.WINNER ) ORDER BY MATCH#, YEAR; © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

FROM_YEAR WINNER SELECT MATCH#, YEAR, WINNER, SONG, POINTS, VAR FROM (SELECT * FROM EUROVISION_WINNERS WHERE YEAR BETWEEN 1971 AND 1991) 9 MATCH_RECOGNIZE ( TO_YEAR ORDER BY YEAR MEASURES MATCH_NUMBER() MATCH#, CLASSIFIER() VAR ALL ROWS PER MATCH WITH UNMATCHED ROWS AFTER MATCH SKIP TO FIRST DIFF NON_WINNING_YEARS PATTERN (A SAME* DIFF+ LIKE_FIRST+) DEFINE SAME AS WINNER = PREV(WINNER), DIFF AS WINNER != A.WINNER, LIKE_FIRST AS WINNER = A.WINNER ) ORDER BY MATCH#, YEAR; © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

SELECT MATCH#, WINNER, FROM_YEAR, TO_YEAR, FROM_YEAR WINNER NON_WINNER_YEARS FROM (SELECT * FROM EUROVISION_WINNERS WHERE YEAR BETWEEN 1971 AND 1991) MATCH_RECOGNIZE ( ORDER BY YEAR 9 MEASURES TO_YEAR MATCH_NUMBER() MATCH#, A.WINNER WINNER, FIRST(YEAR) FROM_YEAR, LAST(YEAR) TO_YEAR, COUNT(DIFF.*) NON_WINNER_YEARS NON_WINNING_YEARS ONE ROW PER MATCH AFTER MATCH SKIP TO FIRST DIFF PATTERN (A SAME* DIFF+ LIKE_FIRST+) DEFINE SAME AS WINNER = PREV(WINNER), DIFF AS WINNER != A.WINNER, LIKE_FIRST AS WINNER = A.WINNER ) ORDER BY MATCH#; © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

SELECT MATCH#, WINNER, FROM_YEAR, TO_YEAR, FROM_YEAR WINNER NON_WINNER_YEARS FROM (SELECT * FROM EUROVISION_WINNERS WHERE YEAR BETWEEN 1971 AND 1991) MATCH_RECOGNIZE ( ORDER BY YEAR 9 MEASURES TO_YEAR MATCH_NUMBER() MATCH#, A.WINNER WINNER, FIRST(YEAR) FROM_YEAR, LAST(YEAR) TO_YEAR, COUNT(DIFF.*) NON_WINNER_YEARS NON_WINNING_YEARS ONE ROW PER MATCH AFTER MATCH SKIP TO FIRST DIFF PATTERN (A SAME* DIFF+ LIKE_FIRST+) DEFINE SAME AS WINNER = PREV(WINNER), DIFF AS WINNER != A.WINNER, LIKE_FIRST AS WINNER = A.WINNER ) ORDER BY MATCH#; © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

SELECT MATCH#, WINNER, FROM_YEAR, TO_YEAR, FROM_YEAR WINNER NON_WINNER_YEARS FROM (SELECT * FROM EUROVISION_WINNERS WHERE YEAR BETWEEN 1971 AND 1991) MATCH_RECOGNIZE ( ORDER BY YEAR 9 MEASURES TO_YEAR MATCH_NUMBER() MATCH#, A.WINNER WINNER, FIRST(YEAR) FROM_YEAR, LAST(YEAR) TO_YEAR, COUNT(DIFF.*) NON_WINNER_YEARS NON_WINNING_YEARS ONE ROW PER MATCH AFTER MATCH SKIP TO FIRST DIFF PATTERN (A SAME* DIFF+ LIKE_FIRST+) DEFINE SAME AS WINNER = PREV(WINNER), DIFF AS WINNER != A.WINNER, LIKE_FIRST AS WINNER = A.WINNER ) ORDER BY MATCH#; © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

SELECT MATCH#, WINNER, FROM_YEAR, TO_YEAR, FROM_YEAR WINNER NON_WINNER_YEARS FROM (SELECT * FROM EUROVISION_WINNERS WHERE YEAR BETWEEN 1971 AND 1991) MATCH_RECOGNIZE ( ORDER BY YEAR 9 MEASURES TO_YEAR MATCH_NUMBER() MATCH#, A.WINNER WINNER, FIRST(YEAR) FROM_YEAR, LAST (YEAR) TO_YEAR, COUNT(DIFF.*) NON_WINNER_YEARS NON_WINNING_YEARS ONE ROW PER MATCH AFTER MATCH SKIP TO FIRST DIFF PATTERN (A SAME* DIFF+ LIKE_FIRST+) DEFINE SAME AS WINNER = PREV(WINNER), DIFF AS WINNER != A.WINNER, LIKE_FIRST AS WINNER = A.WINNER ) ORDER BY MATCH#; © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

SELECT MATCH#, WINNER, FROM_YEAR, COUNTTO_YEAR, FROM_YEAR WINNER NON_WINNER_YEARS MAX FROM (SELECT * FROM EUROVISION_WINNERSMIN WHERE YEAR BETWEEN 1971 AND 1991SUM) MATCH_RECOGNIZE ( AVG ORDER BY YEAR 9 MEASURES TO_YEAR MATCH_NUMBER() MATCH#, A.WINNER WINNER, FIRST(YEAR) FROM_YEAR, LAST (YEAR) TO_YEAR, COUNT(DIFF.*) NON_WINNER_YEARS NON_WINNING_YEARS ONE ROW PER MATCH AFTER MATCH SKIP TO FIRST DIFF PATTERN (A SAME* DIFF+ LIKE_FIRST+) DEFINE SAME AS WINNER = PREV(WINNER), DIFF AS WINNER != A.WINNER, LIKE_FIRST AS WINNER = A.WINNER ) ORDER BY MATCH#; © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

SELECT MATCH#, WINNER, FROM_YEAR, TO_YEAR, FROM_YEAR WINNER NON_WINNER_YEARS FROM (SELECT * FROM EUROVISION_WINNERS WHERE YEAR BETWEEN 1971 AND 1991) MATCH_RECOGNIZE ( ORDER BY YEAR 9 MEASURES TO_YEAR MATCH_NUMBER() MATCH#, A.WINNER WINNER, FIRST(YEAR) FROM_YEAR, LAST (YEAR) TO_YEAR, COUNT(DIFF.*) NON_WINNER_YEARS NON_WINNING_YEARS ONE ROW PER MATCH AFTER MATCH SKIP TO FIRST DIFF PATTERN (A SAME* DIFF+ LIKE_FIRST+) DEFINE SAME AS WINNER = PREV(WINNER), DIFF AS WINNER != A.WINNER, LIKE_FIRST AS WINNER = A.WINNER ) ORDER BY MATCH#; © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren ©

SELECT MATCH#, WINNER, FROM_YEAR, TO_YEAR, FROM_YEAR WINNER NON_WINNER_YEARS FROM (SELECT * FROM EUROVISION_WINNERS WHERE YEAR BETWEEN 1971 AND 1991) MATCH_RECOGNIZE ( ORDER BY YEAR 9 MEASURES TO_YEAR MATCH_NUMBER() MATCH#, A.WINNER WINNER, FIRST(YEAR) FROM_YEAR, LAST (YEAR) TO_YEAR, COUNT(DIFF.*) NON_WINNER_YEARS NON_WINNING_YEARS ONE ROW PER MATCH AFTER MATCH SKIP TO FIRST DIFF PATTERN (A SAME* DIFF+ LIKE_FIRST+) DEFINE SAME AS WINNER = PREV(WINNER), DIFF AS WINNER != A.WINNER, LIKE_FIRST AS WINNER = A.WINNER ) ORDER BY MATCH#; © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Fibonacci Numbers X F 1 2 SELECT * FROM 3 (select rownum X from dual connect by level<=100) 4 MATCH_RECOGNIZE ( 5 ORDER BY X 6 MEASURES 7 CLASSIFIER() AS F_OR_NOT 8 9 ALL ROWS PER MATCH 10 PATTERN ( (F|NF)+ ) 11 DEFINE F AS (X = 1 OR 12 X = 2 OR 13 X = LAST(F.X,1) + LAST(F.X,2)) 14 ); 15 16 17 18 19 20 21 22 © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Fibonacci Numbers X F 1  2 SELECT * FROM 3 (select rownum X from dual connect by level<=100) 4 MATCH_RECOGNIZE ( 5 ORDER BY X 6 MEASURES 7 CLASSIFIER() AS F_OR_NOT 8 9 ALL ROWS PER MATCH 10 PATTERN ( (F|NF)+ ) 11 DEFINE F AS (X = 1 OR 12 X = 2 OR 13 X = LAST(F.X,1) + LAST(F.X,2)) 14 ); 15 16 17 18 19 20 21 22 © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Fibonacci Numbers X F 1  2  SELECT * FROM 3 (select rownum X from dual connect by level<=100) 4 MATCH_RECOGNIZE ( 5 ORDER BY X 6 MEASURES 7 CLASSIFIER() AS F_OR_NOT 8 9 ALL ROWS PER MATCH 10 PATTERN ( (F|NF)+ ) 11 DEFINE F AS (X = 1 OR 12 X = 2 OR 13 X = LAST(F.X,1) + LAST(F.X,2)) 14 ); 15 16 17 18 19 20 21 22 © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Fibonacci Numbers X F 1  2  SELECT * FROM 3  (select rownum X from dual connect by level<=100) 4 MATCH_RECOGNIZE ( 5  ORDER BY X 6 MEASURES 7  CLASSIFIER() AS F_OR_NOT 8 9 ALL ROWS PER MATCH 10 PATTERN ( (F|NF)+ ) 11 DEFINE F AS (X = 1 OR 12 X = 2 OR 13  X = LAST(F.X,1) + LAST(F.X,2)) 14 ); 15 16 17 18 19 20 21  22 © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Implicit Pattern Fibonacci Numbers Variable X F NF 1  2  SELECT * FROM 3  (select rownum X from dual connect by level<=100) 4  MATCH_RECOGNIZE ( 5  ORDER BY X 6  MEASURES 7   CLASSIFIER() AS F_OR_NOT 8 9  ALL ROWS PER MATCH 10  PATTERN ( (F|NF)+ ) 11  DEFINE F AS (X = 1 OR 12  X = 2 OR 13  X = LAST(F.X,1) + LAST(F.X,2)) 14  ); 15  16  17  18  19  20  21  22  © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Implicit Pattern Fibonacci Numbers Variable X F NF 1  2  SELECT * FROM 3  (select rownum X from dual connect by level<=100) 4  MATCH_RECOGNIZE ( 5  ORDER BY X 6  MEASURES Pattern 7   CLASSIFIER() AS F_OR_NOT Alternation 8 9  ALL ROWS PER MATCH 10  PATTERN ( (F|NF)+ ) 11  DEFINE F AS (X = 1 OR 12  X = 2 OR 13  X = LAST(F.X,1) + LAST(F.X,2)) 14  ); 15  16  17  18  19  20  21  22  © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Implicit Pattern Fibonacci Numbers Variable X F NF 1  2  SELECT * FROM 3  (select rownum X from dual connect by level<=100) 4  MATCH_RECOGNIZE ( 5  ORDER BY X 6  MEASURES Pattern 7   CLASSIFIER() AS F_OR_NOT Grouping 8 9  ALL ROWS PER MATCH 10  PATTERN ( (F|NF)+ ) 11  DEFINE F AS (X = 1 OR 12  X = 2 OR 13  X = LAST(F.X,1) + LAST(F.X,2)) 14  ); 15  16  17  18  19  20  21  22  © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Implicit Pattern Fibonacci Numbers Variable X F NF 1  2  SELECT * FROM 3  (select rownum X from dual connect by level<=100) 4  MATCH_RECOGNIZE ( 5  ORDER BY X 6  MEASURES 7   CLASSIFIER() AS F_OR_NOT 8 9  ALL ROWS PER MATCH 10  PATTERN ( (F|NF)+ ) 11  DEFINE F AS (X = 1 OR 12  X = 2 OR 13  X = LAST(F.X,1) + LAST(F.X,2)) 14  ); 15  16  17  18  19  20  21  22  © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Fibonacci Numbers

SELECT * FROM (select rownum X from dual connect by level<=100) MATCH_RECOGNIZE ( ORDER BY X MEASURES CLASSIFIER() AS F_OR_NOT ALL ROWS PER MATCH PATTERN ( (F|NF)+ ) DEFINE F AS (X = 1 OR X = 2 OR X = LAST(F.X,1) + LAST(F.X,2)) ); © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Fibonacci Numbers

SELECT * FROM (select rownum X from dual connect by level<=100) MATCH_RECOGNIZE ( ORDER BY X MEASURES Pattern CLASSIFIER() AS F_OR_NOT Exclusion ALL ROWS PER MATCH PATTERN ( (F|{-NF-})+ ) DEFINE F AS (X = 1 OR X = 2 OR X = LAST(F.X,1) + LAST(F.X,2)) ); © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Fibonacci Numbers

SELECT * FROM (select rownum X from dual connect by level<=100) MATCH_RECOGNIZE ( ORDER BY X MEASURES CLASSIFIER() AS F_OR_NOT ALL ROWS PER MATCH PATTERN ( (F|{-NF-})+ ) DEFINE F AS (X = 1 OR X = 2 OR X = LAST(F.X,1) + LAST(F.X,2)) ); © Oren Nakdimon Oren © This presentation is available in http://db-oriented.com/presentations Nakdimon Oren © Additional Resources

 Chris Saxon’s presentation:  How to Find Patterns in Your Data with SQL Thursday, 22nd Nov, 16:00 Kiew

 The Documentation: https://docs.oracle.com/en/database/oracle/oracle- database/18/dwhsg/sql-pattern-matching-data-warehouses.html

 Keith Laker’s blog: https://oracle-big-data.blogspot.com/

 Stew Ashton’s blog: https://stewashton.wordpress.com/category/match_recognize/ THANK YOU

Oren Nakdimon www.db-oriented.com  [email protected]  +972-54-4393763 @DBoriented