SlideShare a Scribd company logo
1 of 92
Download to read offline
Row Pattern Matching
@MarkusWinand
Image: 72hoursamericanpower.com
Row Pattern Matching Availability
1999
2001
2003
2005
2007
2009
2011
2013
2015
MariaDB
MySQL
PostgreSQL
SQLite
DB2 LUW
12cR1 Oracle
SQL Server
Grouping Consecutive Events
Time
30 minutes
Example: Logfile
Grouping Consecutive Events
Example: Logfile
Time
30 minutes
Session 1 Session 2
Session 3
Session 4
Example problems:
‣ Count sessions
‣ Average session duration
Two approaches:
‣ Start-of-group tagging
‣ Row pattern matching
SELECT	COUNT(grp_start)	groups	
		FROM	(SELECT	CASE	WHEN	ts	>	LAG(	ts,	1,	DATE'1900-01-01'	)	
																														OVER(	ORDER	BY	ts	)	
																														+	INTERVAL	'30'	minute	
																				THEN	1	
																END	grp_start	
										FROM	log	
							)	T
Consecutive Events: Counting Start-of-group tagging
Time
30 minutes
SELECT	COUNT(grp_start)	groups	
		FROM	(SELECT	CASE	WHEN	ts	>	LAG(	ts,	1,	DATE'1900-01-01'	)	
																														OVER(	ORDER	BY	ts	)	
																														+	INTERVAL	'30'	minute	
																				THEN	1	
																END	grp_start	
										FROM	log	
							)	T
Consecutive Events: Counting Start-of-group tagging
Time
30 minutes
count the

non-NULL

values
SELECT	COUNT(*)	sessions	
		FROM	log	
							MATCH_RECOGNIZE(	
								ORDER	BY	ts	
								PATTERN	(	new	)	
								DEFINE	new	AS	ts	>	COALESCE(	PREV(ts)	
																																			,	DATE	'1900-01-01'	
																																			)	
																											+	INTERVAL	'30'	minute		
							)	t
Consecutive Events: Counting Row Pattern Matching
Time
30 minutes
SELECT	COUNT(*)	sessions	
		FROM	log	
							MATCH_RECOGNIZE(	
								ORDER	BY	ts	
								PATTERN	(	new	)	
								DEFINE	new	AS	ts	>	COALESCE(	PREV(ts)	
																																			,	DATE	'1900-01-01'	
																																			)	
																											+	INTERVAL	'30'	minute		
							)	t
Consecutive Events: Counting Row Pattern Matching
Time
30 minutes
row pattern
variable
SELECT	COUNT(*)	sessions	
		FROM	log	
							MATCH_RECOGNIZE(	
								ORDER	BY	ts	
								PATTERN	(	new	)	
								DEFINE	new	AS	ts	>	COALESCE(	PREV(ts)	
																																			,	DATE	'1900-01-01'	
																																			)	
																											+	INTERVAL	'30'	minute		
							)	t
Consecutive Events: Counting Row Pattern Matching
Time
30 minutes
match

only “new”
rows
SELECT	COUNT(*)	sessions	
		FROM	log	
							MATCH_RECOGNIZE(	
								ORDER	BY	ts	
								PATTERN	(	new	)	
								DEFINE	new	AS	ts	>	COALESCE(	PREV(ts)	
																																			,	DATE	'1900-01-01'	
																																			)	
																											+	INTERVAL	'30'	minute		
							)	t
Consecutive Events: Counting Row Pattern Matching
Time
30 minutes
count

rows
SELECT	COUNT(*)	sessions	
					,	AVG(duration)	avg_duration	
		FROM	log	
							MATCH_RECOGNIZE(	
								ORDER	BY	ts	
								MEASURES	
									LAST(ts)	-	FIRST(ts)	AS	duration	
								ONE	ROW	PER	MATCH	
								PATTERN	(	new	cont*	)	
								DEFINE	cont	AS	ts	<	PREV(ts)	
																										+	INTERVAL	'30'	minute		
							)	t
Row Pattern MatchingConsecutive Events: Statistics
Time
30 minutes
define

continuation
Oracle doesn’t support avg on intervals — query doesn’t work as shown
SELECT	COUNT(*)	sessions	
					,	AVG(duration)	avg_duration	
		FROM	log	
							MATCH_RECOGNIZE(	
								ORDER	BY	ts	
								MEASURES	
									LAST(ts)	-	FIRST(ts)	AS	duration	
								ONE	ROW	PER	MATCH	
								PATTERN	(	new	cont*	)	
								DEFINE	cont	AS	ts	<	PREV(ts)	
																										+	INTERVAL	'30'	minute		
							)	t
Row Pattern MatchingConsecutive Events: Statistics
Time
30 minutes
undefined

pattern variable:
matches any row
Oracle doesn’t support avg on intervals — query doesn’t work as shown
SELECT	COUNT(*)	sessions	
					,	AVG(duration)	avg_duration	
		FROM	log	
							MATCH_RECOGNIZE(	
								ORDER	BY	ts	
								MEASURES	
									LAST(ts)	-	FIRST(ts)	AS	duration	
								ONE	ROW	PER	MATCH	
								PATTERN	(	new	cont*	)	
								DEFINE	cont	AS	ts	<	PREV(ts)	
																										+	INTERVAL	'30'	minute		
							)	t
Row Pattern MatchingConsecutive Events: Statistics
Time
30 minutes
any number

of “cont”

rows
Oracle doesn’t support avg on intervals — query doesn’t work as shown
SELECT	COUNT(*)	sessions	
					,	AVG(duration)	avg_duration	
		FROM	log	
							MATCH_RECOGNIZE(	
								ORDER	BY	ts	
								MEASURES	
									LAST(ts)	-	FIRST(ts)	AS	duration	
								ONE	ROW	PER	MATCH	
								PATTERN	(	new	cont*	)	
								DEFINE	cont	AS	ts	<	PREV(ts)	
																										+	INTERVAL	'30'	minute		
							)	t
Row Pattern MatchingConsecutive Events: Statistics
Time
30 minutes
Very much

like GROUP BY
Oracle doesn’t support avg on intervals — query doesn’t work as shown
SELECT	COUNT(*)	sessions	
					,	AVG(duration)	avg_duration	
		FROM	log	
							MATCH_RECOGNIZE(	
								ORDER	BY	ts	
								MEASURES	
									LAST(ts)	-	FIRST(ts)	AS	duration	
								ONE	ROW	PER	MATCH	
								PATTERN	(	new	cont*	)	
								DEFINE	cont	AS	ts	<	PREV(ts)	
																										+	INTERVAL	'30'	minute		
							)	t
Row Pattern MatchingConsecutive Events: Statistics
Time
30 minutes
Very much

like SELECT
Oracle doesn’t support avg on intervals — query doesn’t work as shown
SELECT	COUNT(*)	sessions	
					,	AVG(duration)	avg_duration	
		FROM	log	
							MATCH_RECOGNIZE(	
								ORDER	BY	ts	
								MEASURES	
									LAST(ts)	-	FIRST(ts)	AS	duration	
								ONE	ROW	PER	MATCH	
								PATTERN	(	new	cont*	)	
								DEFINE	cont	AS	ts	<	PREV(ts)	
																										+	INTERVAL	'30'	minute		
							)	t
Row Pattern MatchingConsecutive Events: Statistics
Time
30 minutes
Oracle doesn’t support avg on intervals — query doesn’t work as shown
Consecutive Events: Statistics Start-of-group tagging
Time
30 minutes
Now, let’s try using window functions
SELECT	count(*)	sessions,	avg(duration)	avg_duration	
		FROM	(SELECT	MAX(ts)	-	MIN(ts)	duration	
										FROM	(SELECT	ts,	COUNT(grp_start)	OVER(ORDER	BY	ts)	session_no	
																		FROM	(SELECT	ts,	CASE	WHEN	ts	>=	LAG(	ts,	1,	DATE’1900-01-1'	)	
																																																			OVER(	ORDER	BY	ts	)	
																																																			+	INTERVAL	'30'	minute	
																																								THEN	1	
																																				END	grp_start	
																										FROM	log	
																							)	tagged	
															)	numbered	
									GROUP	BY	session_no	
							)	grouped
Consecutive Events: Statistics Start-of-group tagging
Time
30 minutes
Start-of-group
tags
SELECT	count(*)	sessions,	avg(duration)	avg_duration	
		FROM	(SELECT	MAX(ts)	-	MIN(ts)	duration	
										FROM	(SELECT	ts,	COUNT(grp_start)	OVER(ORDER	BY	ts)	session_no	
																		FROM	(SELECT	ts,	CASE	WHEN	ts	>=	LAG(	ts,	1,	DATE’1900-01-1'	)	
																																																			OVER(	ORDER	BY	ts	)	
																																																			+	INTERVAL	'30'	minute	
																																								THEN	1	
																																				END	grp_start	
																										FROM	log	
																							)	tagged	
															)	numbered	
									GROUP	BY	session_no	
							)	grouped
Consecutive Events: Statistics Start-of-group tagging
Time
30 minutes
number
sessions
2222 2 33 3 44 42 3 4
1
SELECT	count(*)	sessions,	avg(duration)	avg_duration	
		FROM	(SELECT	MAX(ts)	-	MIN(ts)	duration	
										FROM	(SELECT	ts,	COUNT(grp_start)	OVER(ORDER	BY	ts)	session_no	
																		FROM	(SELECT	ts,	CASE	WHEN	ts	>=	LAG(	ts,	1,	DATE’1900-01-1'	)	
																																																			OVER(	ORDER	BY	ts	)	
																																																			+	INTERVAL	'30'	minute	
																																								THEN	1	
																																				END	grp_start	
																										FROM	log	
																							)	tagged	
															)	numbered	
									GROUP	BY	session_no	
							)	grouped
Consecutive Events: Statistics Start-of-group tagging
Time
30 minutes 2222 2 33 3 44 42 3 4
1
SELECT	count(*)	sessions,	avg(duration)	avg_duration	
		FROM	(SELECT	MAX(ts)	-	MIN(ts)	duration	
										FROM	(SELECT	ts,	COUNT(grp_start)	OVER(ORDER	BY	ts)	session_no	
																		FROM	(SELECT	ts,	CASE	WHEN	ts	>=	LAG(	ts,	1,	DATE’1900-01-1'	)	
																																																			OVER(	ORDER	BY	ts	)	
																																																			+	INTERVAL	'30'	minute	
																																								THEN	1	
																																				END	grp_start	
																										FROM	log	
																							)	tagged	
															)	numbered	
									GROUP	BY	session_no	
							)	grouped
Consecutive Events: Statistics Start-of-group tagging
Time
30 minutes
4 Levels:
2 with window functions
2 for grouping


What about performance?
2222 2 33 3 44 42 3 4
1
Tolerating Gaps
Example: Comments (new vs. read)
Tolerating Gaps
Example: Comments (new vs. read)
Show comments which…
‣ …are new or
‣ …between two new ones

(show the comment instead of a “load more” button)
Two approaches:
‣ Start-of-group tagging
‣ Row pattern matching
Comments
new commentread comment
SELECT	id,	marker	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	new+	(read	new+)*	)	
								DEFINE	
									new	AS	(marker	=	'X')	
							)	T	
ORDER	BY	id
Tolerating Gaps Row Pattern Matching
Comments
Start with one

or more NEW

comment(s)
SELECT	id,	marker	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	new+	(read	new+)*	)	
								DEFINE	
									new	AS	(marker	=	'X')	
							)	T	
ORDER	BY	id
Tolerating Gaps Row Pattern Matching
Comments
Start with one

or more NEW

comment(s)
Doesn’t match
SELECT	id,	marker	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	new+	(read	new+)*	)	
								DEFINE	
									new	AS	(marker	=	'X')	
							)	T	
ORDER	BY	id
Tolerating Gaps Row Pattern Matching
Comments
Start with one

or more NEW

comment(s)
Two rows
match “new+”
SELECT	id,	marker	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	new+	(read	new+)*	)	
								DEFINE	
									new	AS	(marker	=	'X')	
							)	T	
ORDER	BY	id
Tolerating Gaps Row Pattern Matching
Comments
Match exactly

one row (any)
SELECT	id,	marker	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	new+	(read	new+)*	)	
								DEFINE	
									new	AS	(marker	=	'X')	
							)	T	
ORDER	BY	id
Tolerating Gaps Row Pattern Matching
Comments
SELECT	id,	marker	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	new+	(read	new+)*	)	
								DEFINE	
									new	AS	(marker	=	'X')	
							)	T	
ORDER	BY	id
Tolerating Gaps Row Pattern Matching
Comments
Repeat group

any number

of times
SELECT	id,	marker	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	new+	(read	new+)*	)	
								DEFINE	
									new	AS	(marker	=	'X')	
							)	T	
ORDER	BY	id
Tolerating Gaps Row Pattern Matching
Comments
Repeat group

any number

of times
SELECT	id,	marker	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	new+	(read	new+)*	)	
								DEFINE	
									new	AS	(marker	=	'X')	
							)	T	
ORDER	BY	id
Tolerating Gaps Row Pattern Matching
Comments
First match
SELECT	id,	marker	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	new+	(read	new+)*	)	
								DEFINE	
									new	AS	(marker	=	'X')	
							)	T	
ORDER	BY	id
Tolerating Gaps Row Pattern Matching
CommentsSecond

match
SELECT	id,	marker	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	new+	(read	new+)*	)	
								DEFINE	
									new	AS	(marker	=	'X')	
							)	T	
ORDER	BY	id
Tolerating Gaps Row Pattern Matching
Comments
Tolerating Gaps (also first/last) Row Pattern Matching
Comments
What about
this?
SELECT	id,	marker	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	(^read)?	new+	(read	new+)*	(read$)?	)	
								DEFINE	
									new	AS	(marker	=	'X')	
							)	T	
ORDER	BY	thread_id,	id
Tolerating Gaps (also first/last) Row Pattern Matching
Comments
What about
this?
SELECT	id,	marker	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	(^read)?	new+	(read	new+)*	(read$)?	)	
								DEFINE	
									new	AS	(marker	=	'X')	
							)	T	
ORDER	BY	thread_id,	id
Tolerating Gaps (also first/last) Row Pattern Matching
Comments
Match

“read” at the very

beginning
SELECT	id,	marker	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	(^read)?	new+	(read	new+)*	(read$)?	)	
								DEFINE	
									new	AS	(marker	=	'X')	
							)	T	
ORDER	BY	thread_id,	id
Tolerating Gaps (also first/last) Row Pattern Matching
Comments
Optionally match

“read” at the very

beginning
SELECT	id,	marker	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	(^read)?	new+	(read	new+)*	(read$)?	)	
								DEFINE	
									new	AS	(marker	=	'X')	
							)	T	
ORDER	BY	thread_id,	id
Tolerating Gaps (also first/last) Row Pattern Matching
Comments
Tolerating Gaps lead & lag
Comments
Now, let’s try using window functions
SELECT	t.*	
		FROM	(SELECT	msg.*	
													,	LAG	(	marker,	1,	'X'	)	OVER(	ORDER	BY	id	)	prev_marker	
													,	LEAD(	marker,	1,	'X'	)	OVER(	ORDER	BY	id	)	next_marker	
										FROM	msg	
							)	t	
WHERE	marker	=	'X'	
			OR	(prev_marker	=	'X'	and	next_marker	=	‘X')	
ORDER	BY	id
Tolerating Gaps lead & lag
Comments
I don't care what anything was designed to do,
I care about what it can do.
—Apollo 13, Universal Pictures
Tolerating Gaps (with grouped gaps) Row Pattern Matching
Comments
Tolerating Gaps (with grouped gaps) Row Pattern Matching
Comments
Load 2 more Load 9 more
Tolerating Gaps (with grouped gaps) Row Pattern Matching
Comments
Load 2 more Load 9 more
Tell me how many rows you skipped in between
SELECT	id,	marker,	gap_length	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								MEASURES	
										FINAL	COUNT(more.*)	AS	gap_length	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	(^read)?	new+	(read	new+)*	(read$)?	|	more	{-	more*	-}	)	
								DEFINE	new		AS	(marker		=	'X'),	
															more	AS	(marker	!=	'X')	
							)	T	
ORDER	BY	id
Tolerating Gaps (with grouped gaps) Row Pattern Matching
Comments
Load 2 more Load 9 more
SELECT	id,	marker,	gap_length	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								MEASURES	
										FINAL	COUNT(more.*)	AS	gap_length	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	(^read)?	new+	(read	new+)*	(read$)?	|	more	{-	more*	-}	)	
								DEFINE	new		AS	(marker		=	'X'),	
															more	AS	(marker	!=	'X')	
							)	T	
ORDER	BY	id
Tolerating Gaps (with grouped gaps) Row Pattern Matching
Comments
Load 2 more Load 9 more
Alternative
Match, but
don’t return
SELECT	id,	marker,	gap_length	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								MEASURES	
										FINAL	COUNT(more.*)	AS	gap_length	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	(^read)?	new+	(read	new+)*	(read$)?	|	more	{-	more*	-}	)	
								DEFINE	new		AS	(marker		=	'X'),	
															more	AS	(marker	!=	'X')	
							)	T	
ORDER	BY	id
Tolerating Gaps (with grouped gaps) Row Pattern Matching
Comments
Load 2 more Load 9 more
Consider

all rows
SELECT	id,	marker,	gap_length	
		FROM	msg	
							MATCH_RECOGNIZE	(	
								ORDER	BY	id	
								MEASURES	
										FINAL	COUNT(more.*)	AS	gap_length	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	(^read)?	new+	(read	new+)*	(read$)?	|	more	{-	more*	-}	)	
								DEFINE	new		AS	(marker		=	'X'),	
															more	AS	(marker	!=	'X')	
							)	T	
ORDER	BY	id
Tolerating Gaps (with grouped gaps) Row Pattern Matching
Comments
Load 2 more Load 9 more
Only rows
matched to the
pattern variable
“more”
SELECT	id,	marker	
													,	CASE	WHEN	marker	!=	'X'	AND	gap_length	>	2	
																				THEN	gap_length	
																END	gap_length	
										FROM	(SELECT	t2.*,	COUNT(	CASE	WHEN	marker	!=	'X'	THEN	1	END	)	
																														OVER(	PARTITION	BY	new_counter	)	gap_length			
																		FROM	(SELECT	msg.*,	COUNT(	CASE	WHEN	marker	=	'X'	THEN	1	END	)	
																																							OVER(	ORDER	BY	id	)	new_counter	
																																				,	LAG		(	marker,	1,	'X'	)	
																																							OVER(	ORDER	BY	id	)	prev_marker	
																										FROM	msg	
																							)	t2	
															)	t3	
									WHERE	marker	=	'X'	OR	gap_length	=	1	OR	prev_marker=	'X'	
									ORDER	BY	id
Start-of-group taggingTolerating Gaps (with grouped gaps)
Comments
Top-N Per Group
Example: List 3 most recent comments per topic
Top-N Per Group
Example: List 3 most recent comments per topic
Time
Topic 3
Topic 2
Topic 1
Top-N Per Group
Example: List 3 most recent comments per topic
Three approaches:
‣ lateral sub-query (requires specific indexing)
‣ Row pattern matching (requires 12c)
‣ row_number() window function
Time
Topic 3
Topic 2
Topic 1
SELECT	*	
		FROM	t	
							MATCH_RECOGNIZE(	
								PARTITION	BY	topic	
								ORDER	BY	val	
								MEASURES	
									RUNNING	COUNT(*)	AS	rn	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	^a{1,3}	)	
								DEFINE	
									a	AS	1=1	
							)
Time
Topic 3
Topic 2
Topic 1
Top-N Per Group
per “topic”
processing
SELECT	*	
		FROM	t	
							MATCH_RECOGNIZE(	
								PARTITION	BY	topic	
								ORDER	BY	val	
								MEASURES	
									RUNNING	COUNT(*)	AS	rn	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	^a{1,3}	)	
								DEFINE	
									a	AS	1=1	
							)
Time
Topic 3
Topic 2
Topic 1
Top-N Per Group
Consider rows
up till current
row
SELECT	*	
		FROM	t	
							MATCH_RECOGNIZE(	
								PARTITION	BY	topic	
								ORDER	BY	val	
								MEASURES	
									RUNNING	COUNT(*)	AS	rn	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	^a{1,3}	)	
								DEFINE	
									a	AS	1=1	
							)
Time
Topic 3
Topic 2
Topic 1
Top-N Per Group
1, 2, or 3 times
SELECT	*	
		FROM	t	
							MATCH_RECOGNIZE(	
								PARTITION	BY	topic	
								ORDER	BY	val	
								MEASURES	
									RUNNING	COUNT(*)	AS	rn	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	^a{1,3}	)	
								DEFINE	
									a	AS	1=1	
							)
Time
Topic 3
Topic 2
Topic 1
Top-N Per Group
DEFINE is
non-optional:
Use dummy
SELECT	*	
		FROM	t	
							MATCH_RECOGNIZE(	
								PARTITION	BY	topic	
								ORDER	BY	val	
								MEASURES	
									RUNNING	COUNT(*)	AS	rn	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	^a{1,3}	)	
								DEFINE	
									a	AS	1=1	
							)
SELECT	*		
		FROM	(	
			SELECT	t.*	
								,	ROW_NUMBER()	
											OVER	(PARTITION	BY	topic	
																	ORDER	BY	val)	rn	
				FROM	t	
		)	t	
	WHERE	rn	<=	3
Time
Topic 3
Topic 2
Topic 1
Top-N Per Group
SELECT	*	
		FROM	t	
							MATCH_RECOGNIZE(	
								PARTITION	BY	topic	
								ORDER	BY	val	
								MEASURES	
									RUNNING	COUNT(*)	AS	rn	
								ALL	ROWS	PER	MATCH	
								PATTERN	(	^a+	)	
								DEFINE	
									a	AS	count(*)	<=	3	
							)
SELECT	*		
		FROM	(	
			SELECT	t.*	
								,	ROW_NUMBER()	
											OVER	(PARTITION	BY	topic	
																	ORDER	BY	val)	rn	
				FROM	t	
		)	t	
	WHERE	rn	<=	3
Time
Topic 3
Topic 2
Topic 1
Top-N Per Group
Always
RUNNING
semantic
Time Intervals (non-overlapping)
Example: Bookings are stored as [begin; end[ intervals
Time Intervals (non-overlapping)
Example: Bookings are stored as [begin; end[ intervals
Two problems:
‣ Find free time-slots
‣ Close free time-slots
Time
Busy Busy Busy
Time
SELECT	*	
		FROM	reservations	
							MATCH_RECOGNIZE(	
								ORDER	BY	begin	
								MEASURES	
									a.end			AS	begin,	
									b.begin	AS	end	
								ONE	ROW	PER	MATCH	
								AFTER	MATCH	SKIP	TO	b	
								PATTERN	(	a	b	)	
								DEFINE	
									b	AS	a.end	<	begin	
							)
Time Intervals (non-overlapping)
Time
SELECT	*	
		FROM	reservations	
							MATCH_RECOGNIZE(	
								ORDER	BY	begin	
								MEASURES	
									a.end			AS	begin,	
									b.begin	AS	end	
								ONE	ROW	PER	MATCH	
								AFTER	MATCH	SKIP	TO	b	
								PATTERN	(	a	b	)	
								DEFINE	
									b	AS	a.end	<	begin	
							)
a b
Time Intervals (non-overlapping)
Time
SELECT	*	
		FROM	reservations	
							MATCH_RECOGNIZE(	
								ORDER	BY	begin	
								MEASURES	
									a.end			AS	begin,	
									b.begin	AS	end	
								ONE	ROW	PER	MATCH	
								AFTER	MATCH	SKIP	TO	b	
								PATTERN	(	a	b	)	
								DEFINE	
									b	AS	a.end	<	begin	
							)
a b
Time Intervals (non-overlapping)
Time
SELECT	*	
		FROM	reservations	
							MATCH_RECOGNIZE(	
								ORDER	BY	begin	
								MEASURES	
									a.end			AS	begin,	
									b.begin	AS	end	
								ONE	ROW	PER	MATCH	
								AFTER	MATCH	SKIP	TO	b	
								PATTERN	(	a	b	)	
								DEFINE	
									b	AS	a.end	<	begin	
							)
a b
Time Intervals (non-overlapping)
SELECT	*	
		FROM	reservations	
							MATCH_RECOGNIZE(	
								ORDER	BY	begin	
								MEASURES	
									a.end			AS	begin,	
									b.begin	AS	end	
								ONE	ROW	PER	MATCH	
								AFTER	MATCH	SKIP	TO	b	
								PATTERN	(	a	b	)	
								DEFINE	
									b	AS	a.end	<	begin	
							)
a b
Time Intervals (non-overlapping)
Time
SELECT	*	
		FROM	reservations	
							MATCH_RECOGNIZE(	
								ORDER	BY	begin	
								MEASURES	
									a.end			AS	begin,	
									b.begin	AS	end	
								ONE	ROW	PER	MATCH	
								AFTER	MATCH	SKIP	TO	b	
								PATTERN	(	a	b	)	
								DEFINE	
									b	AS	a.end	<	begin	
							)
a b
Time Intervals (non-overlapping)
Time
SELECT	*	
		FROM	reservations	
							MATCH_RECOGNIZE(	
								ORDER	BY	begin	
								MEASURES	
									a.end			AS	begin,	
									b.begin	AS	end	
								ONE	ROW	PER	MATCH	
								AFTER	MATCH	SKIP	TO	b	
								PATTERN	(	a	b	)	
								DEFINE	
									b	AS	a.end	<	begin	
							)
a b
Time Intervals (non-overlapping)
Time
Default is to

continue AFTER

last matched row
SELECT	*	
		FROM	reservations	
							MATCH_RECOGNIZE(	
								ORDER	BY	begin	
								MEASURES	
									a.end			AS	begin,	
									b.begin	AS	end	
								ONE	ROW	PER	MATCH	
								AFTER	MATCH	SKIP	TO	b	
								PATTERN	(	a	b	)	
								DEFINE	
									b	AS	a.end	<	begin	
							)
Time Intervals (non-overlapping)
Time
SELECT	*	
		FROM	reservations	
							MATCH_RECOGNIZE(	
								ORDER	BY	begin	
								MEASURES	
									a.end			AS	begin,	
									b.begin	AS	end	
								ONE	ROW	PER	MATCH	
								AFTER	MATCH	SKIP	TO	b	
								PATTERN	(	a	b	)	
								DEFINE	
									b	AS	a.end	<	begin	
							)
Time Intervals (non-overlapping)
Time
a b
SELECT	*	
		FROM	reservations	
							MATCH_RECOGNIZE(	
								ORDER	BY	begin	
								MEASURES	
									a.end			AS	begin,	
									b.begin	AS	end	
								ONE	ROW	PER	MATCH	
								AFTER	MATCH	SKIP	TO	b	
								PATTERN	(	a	b	)	
								DEFINE	
									b	AS	a.end	<	begin	
							)
Time Intervals (non-overlapping)
a b
Time
SELECT	*	
		FROM	reservations	
							MATCH_RECOGNIZE(	
								ORDER	BY	begin	
								MEASURES	
									a.end			AS	begin,	
									b.begin	AS	end	
								ONE	ROW	PER	MATCH	
								AFTER	MATCH	SKIP	TO	b	
								PATTERN	(	a	b	)	
								DEFINE	
									b	AS	a.end	<	begin	
							)
Time Intervals (non-overlapping)
Time
SELECT	*	
		FROM	reservations	
							MATCH_RECOGNIZE(	
								ORDER	BY	begin	
								MEASURES	
									a.end			AS	begin,	
									b.begin	AS	end	
								ONE	ROW	PER	MATCH	
								AFTER	MATCH	SKIP	TO	b	
								PATTERN	(	a	b	)	
								DEFINE	
									b	AS	a.end	<	begin	
							)
Time Intervals (non-overlapping)
Time
SELECT	*	
		FROM	reservations	
							MATCH_RECOGNIZE(	
								ORDER	BY	begin	
								MEASURES	
									a.end			AS	begin,	
									b.begin	AS	end	
								ONE	ROW	PER	MATCH	
								AFTER	MATCH	SKIP	TO	b	
								PATTERN	(	a	b	)	
								DEFINE	
									b	AS	a.end	<	begin	
							)
Time Intervals (non-overlapping)
Time
SELECT	*	
		FROM	(SELECT	end	begin	
													,	LEAD(begin)	
															OVER(ORDER	BY	begin)	end	
										FROM	reservations	
							)	
	WHERE	begin	<	end
Row Pattern Matching
Time
Time Intervals (close gaps)
SELECT	b	begin,	e	end,	type	
		FROM	reservations	MATCH_RECOGNIZE(	
																						ORDER	BY	begin	
																						MEASURES	CASE	WHEN	free.begin	IS	NULL	THEN	busy.begin	
																																																												ELSE	busy.end	
																																END	AS	b	
																														,	COALESCE(free.begin,	busy.end)	AS	e	
																														,	CLASSIFIER()	as	type	
																						ALL	ROWS	PER	MATCH	
																						AFTER	MATCH	SKIP	TO	NEXT	ROW	
																						PATTERN	(	busy	free?	)	
																						DEFINE	free	AS	begin	>	PREV(end)	
																				)
Row Pattern Matching
Time
Time Intervals (close gaps)
Always match

one row. Second only

if there is a gap
Busy Free
SELECT	b	begin,	e	end,	type	
		FROM	reservations	MATCH_RECOGNIZE(	
																						ORDER	BY	begin	
																						MEASURES	CASE	WHEN	free.begin	IS	NULL	THEN	busy.begin	
																																																												ELSE	busy.end	
																																END	AS	b	
																														,	COALESCE(free.begin,	busy.end)	AS	e	
																														,	CLASSIFIER()	as	type	
																						ALL	ROWS	PER	MATCH	
																						AFTER	MATCH	SKIP	TO	NEXT	ROW	
																						PATTERN	(	busy	free?	)	
																						DEFINE	free	AS	begin	>	PREV(end)	
																				)
Row Pattern Matching
Time
Time Intervals (close gaps)
Busy Free
SELECT	b	begin,	e	end,	type	
		FROM	reservations	MATCH_RECOGNIZE(	
																						ORDER	BY	begin	
																						MEASURES	CASE	WHEN	free.begin	IS	NULL	THEN	busy.begin	
																																																												ELSE	busy.end	
																																END	AS	b	
																														,	COALESCE(free.begin,	busy.end)	AS	e	
																														,	CLASSIFIER()	as	type	
																						ALL	ROWS	PER	MATCH	
																						AFTER	MATCH	SKIP	TO	NEXT	ROW	
																						PATTERN	(	busy	free?	)	
																						DEFINE	free	AS	begin	>	PREV(end)	
																				)
Row Pattern Matching
Time
Time Intervals (close gaps)
Busy Free
If it is not a

“free” row, pass

row through
SELECT	b	begin,	e	end,	type	
		FROM	reservations	MATCH_RECOGNIZE(	
																						ORDER	BY	begin	
																						MEASURES	CASE	WHEN	free.begin	IS	NULL	THEN	busy.begin	
																																																												ELSE	busy.end	
																																END	AS	b	
																														,	COALESCE(free.begin,	busy.end)	AS	e	
																														,	CLASSIFIER()	as	type	
																						ALL	ROWS	PER	MATCH	
																						AFTER	MATCH	SKIP	TO	NEXT	ROW	
																						PATTERN	(	busy	free?	)	
																						DEFINE	free	AS	begin	>	PREV(end)	
																				)
Row Pattern MatchingTime Intervals (close gaps)
Busy Free
Time
SELECT	b	begin,	e	end,	type	
		FROM	reservations	MATCH_RECOGNIZE(	
																						ORDER	BY	begin	
																						MEASURES	CASE	WHEN	free.begin	IS	NULL	THEN	busy.begin	
																																																												ELSE	busy.end	
																																END	AS	b	
																														,	COALESCE(free.begin,	busy.end)	AS	e	
																														,	CLASSIFIER()	as	type	
																						ALL	ROWS	PER	MATCH	
																						AFTER	MATCH	SKIP	TO	NEXT	ROW	
																						PATTERN	(	busy	free?	)	
																						DEFINE	free	AS	begin	>	PREV(end)	
																				)
Row Pattern MatchingTime Intervals (close gaps)
Busy Free
Time
Free
SELECT	b	begin,	e	end,	type	
		FROM	reservations	MATCH_RECOGNIZE(	
																						ORDER	BY	begin	
																						MEASURES	CASE	WHEN	free.begin	IS	NULL	THEN	busy.begin	
																																																												ELSE	busy.end	
																																END	AS	b	
																														,	COALESCE(free.begin,	busy.end)	AS	e	
																														,	CLASSIFIER()	as	type	
																						ALL	ROWS	PER	MATCH	
																						AFTER	MATCH	SKIP	TO	NEXT	ROW	
																						PATTERN	(	busy	free?	)	
																						DEFINE	free	AS	begin	>	PREV(end)	
																				)
Row Pattern MatchingTime Intervals (close gaps)
Busy Free
Time
Free
SELECT	b	begin,	e	end,	type	
		FROM	reservations	MATCH_RECOGNIZE(	
																						ORDER	BY	begin	
																						MEASURES	CASE	WHEN	free.begin	IS	NULL	THEN	busy.begin	
																																																												ELSE	busy.end	
																																END	AS	b	
																														,	COALESCE(free.begin,	busy.end)	AS	e	
																														,	CLASSIFIER()	as	type	
																						ALL	ROWS	PER	MATCH	
																						AFTER	MATCH	SKIP	TO	NEXT	ROW	
																						PATTERN	(	busy	free?	)	
																						DEFINE	free	AS	begin	>	PREV(end)	
																				)
Row Pattern MatchingTime Intervals (close gaps)
Busy
Time
Free
SELECT	b	begin,	e	end,	type	
		FROM	reservations	MATCH_RECOGNIZE(	
																						ORDER	BY	begin	
																						MEASURES	CASE	WHEN	free.begin	IS	NULL	THEN	busy.begin	
																																																												ELSE	busy.end	
																																END	AS	b	
																														,	COALESCE(free.begin,	busy.end)	AS	e	
																														,	CLASSIFIER()	as	type	
																						ALL	ROWS	PER	MATCH	
																						AFTER	MATCH	SKIP	TO	NEXT	ROW	
																						PATTERN	(	busy	free?	)	
																						DEFINE	free	AS	begin	>	PREV(end)	
																				)
Row Pattern MatchingTime Intervals (close gaps)
Busy
Time
Busy FreeFree
SELECT	b	begin,	e	end,	type	
		FROM	reservations	MATCH_RECOGNIZE(	
																						ORDER	BY	begin	
																						MEASURES	CASE	WHEN	free.begin	IS	NULL	THEN	busy.begin	
																																																												ELSE	busy.end	
																																END	AS	b	
																														,	COALESCE(free.begin,	busy.end)	AS	e	
																														,	CLASSIFIER()	as	type	
																						ALL	ROWS	PER	MATCH	
																						AFTER	MATCH	SKIP	TO	NEXT	ROW	
																						PATTERN	(	busy	free?	)	
																						DEFINE	free	AS	begin	>	PREV(end)	
																				)
Row Pattern MatchingTime Intervals (close gaps)
Busy Busy FreeFree
Time
Free
SELECT	b	begin,	e	end,	type	
		FROM	reservations	MATCH_RECOGNIZE(	
																						ORDER	BY	begin	
																						MEASURES	CASE	WHEN	free.begin	IS	NULL	THEN	busy.begin	
																																																												ELSE	busy.end	
																																END	AS	b	
																														,	COALESCE(free.begin,	busy.end)	AS	e	
																														,	CLASSIFIER()	as	type	
																						ALL	ROWS	PER	MATCH	
																						AFTER	MATCH	SKIP	TO	NEXT	ROW	
																						PATTERN	(	busy	free?	)	
																						DEFINE	free	AS	begin	>	PREV(end)	
																				)
Row Pattern MatchingTime Intervals (close gaps)
Busy BusyFree
Time
Free Busy
SELECT	begin,	end,	type	
		FROM	(SELECT	end	begin	
													,	LEAD(begin)	OVER(ORDER	BY	begin)	end	
													,	'FREE'	type	
										FROM	reservations	
							)	
	WHERE	begin	<	end	
	UNION	ALL	
SELECT	begin	
					,	end	
					,	'BUSY'	type	
		FROM	reservations
Busy BusyFree
Time
Free Busy
Time Intervals (close gaps) Window function
Endless possibilitesRow Pattern Matching
GROUP	BY

			➡	ONE	ROW	PER	MATCH
OVER	()

			➡	ALL	ROWS	PER	MATCH,	FINAL,	RUNNING
HAVING,	WHERE

			➡	PATTERN (unmatched, suppressed {-	…	-})
Mixing GROUP	BY and OVER()

			➡	ALL	ROWS	PER	MATCH + all-but-one rows suppressed
Data-driven match length 

			➡ SUM, COUNT, … in DEFINE
Duplicating rows (to some extend)

			➡ ALL	ROWS	PER	MATCH + AFTER	MATCH	SKIP	TO	…
What if I told you,
you can also
find patterns?
Not/Barely covered in this presentationRow Pattern Matching
‣ Reluctant (non-greedy) matching
‣ SHOW/OMIT	EMPTY	MATCHES

WITH	UNMATCHED	ROWS
‣ SUBSET (define pattern-vars for use in MEASURES,

							DEFINE and AFTER	MATCH	SKIP	TO)
‣ PREV, NEXT, FIRST, LAST (with some nesting!)
‣MATCH_NUMBER()
Obstacles and Issues (as of 12r1)Row Pattern Matching
‣ JDBC !!!!!

Tokens ?, {, } have special meaning in JDBC.

You have to escape them using {	...	}

https://docs.oracle.com/database/121/JJDBC/apxref.htm#CHECHCJH
‣ ORA-62513: Quantified subpatterns that can have empty matches are not yet supported



PATTERN	(	x	(a*	b*)+	y	)
‣ ORA-62512: This aggregate is not yet supported in MATCH_RECOGNIZE clause.

(only COUNT, SUM, AVG, MIN, and MAX)
About @MarkusWinand
‣Training for Developers
‣ SQL Performance (Indexing)
‣ Modern SQL
‣ On-Site or Online
‣SQL Tuning
‣ Index-Redesign
‣ Query Improvements
‣ On-Site or Online
http://winand.at/
About @MarkusWinand
€0,-
€10-30
sql-performance-explained.com
About @MarkusWinand
@ModernSQL
http://modern-sql.com

More Related Content

What's hot

Apache Spark Introduction and Resilient Distributed Dataset basics and deep dive
Apache Spark Introduction and Resilient Distributed Dataset basics and deep diveApache Spark Introduction and Resilient Distributed Dataset basics and deep dive
Apache Spark Introduction and Resilient Distributed Dataset basics and deep diveSachin Aggarwal
 
Polymorphic Table Functions in 18c
Polymorphic Table Functions in 18cPolymorphic Table Functions in 18c
Polymorphic Table Functions in 18cAndrej Pashchenko
 
Oracle 12c PDB insights
Oracle 12c PDB insightsOracle 12c PDB insights
Oracle 12c PDB insightsKirill Loifman
 
ClickHouse Features for Advanced Users, by Aleksei Milovidov
ClickHouse Features for Advanced Users, by Aleksei MilovidovClickHouse Features for Advanced Users, by Aleksei Milovidov
ClickHouse Features for Advanced Users, by Aleksei MilovidovAltinity Ltd
 
Troubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming ReplicationTroubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming ReplicationAlexey Lesovsky
 
ClickHouse Mark Cache, by Mik Kocikowski, Cloudflare
ClickHouse Mark Cache, by Mik Kocikowski, CloudflareClickHouse Mark Cache, by Mik Kocikowski, Cloudflare
ClickHouse Mark Cache, by Mik Kocikowski, CloudflareAltinity Ltd
 
XIDを周回させてみよう
XIDを周回させてみようXIDを周回させてみよう
XIDを周回させてみようAkio Ishida
 
PostgreSQL - Haute disponibilité avec Patroni
PostgreSQL - Haute disponibilité avec PatroniPostgreSQL - Haute disponibilité avec Patroni
PostgreSQL - Haute disponibilité avec Patronislardiere
 
Oracle statistics by example
Oracle statistics by exampleOracle statistics by example
Oracle statistics by exampleMauro Pagano
 
Same plan different performance
Same plan different performanceSame plan different performance
Same plan different performanceMauro Pagano
 
Hash join in MySQL 8
Hash join in MySQL 8Hash join in MySQL 8
Hash join in MySQL 8Erik Frøseth
 
Oracle Fleet Patching and Provisioning Deep Dive Webcast Slides
Oracle Fleet Patching and Provisioning Deep Dive Webcast SlidesOracle Fleet Patching and Provisioning Deep Dive Webcast Slides
Oracle Fleet Patching and Provisioning Deep Dive Webcast SlidesLudovico Caldara
 
OpenZFS novel algorithms: snapshots, space allocation, RAID-Z - Matt Ahrens
OpenZFS novel algorithms: snapshots, space allocation, RAID-Z - Matt AhrensOpenZFS novel algorithms: snapshots, space allocation, RAID-Z - Matt Ahrens
OpenZFS novel algorithms: snapshots, space allocation, RAID-Z - Matt AhrensMatthew Ahrens
 
Webinar: Strength in Numbers: Introduction to ClickHouse Cluster Performance
Webinar: Strength in Numbers: Introduction to ClickHouse Cluster PerformanceWebinar: Strength in Numbers: Introduction to ClickHouse Cluster Performance
Webinar: Strength in Numbers: Introduction to ClickHouse Cluster PerformanceAltinity Ltd
 
All About JSON and ClickHouse - Tips, Tricks and New Features-2022-07-26-FINA...
All About JSON and ClickHouse - Tips, Tricks and New Features-2022-07-26-FINA...All About JSON and ClickHouse - Tips, Tricks and New Features-2022-07-26-FINA...
All About JSON and ClickHouse - Tips, Tricks and New Features-2022-07-26-FINA...Altinity Ltd
 
ClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEO
ClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEOClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEO
ClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEOAltinity Ltd
 
Migration to ClickHouse. Practical guide, by Alexander Zaitsev
Migration to ClickHouse. Practical guide, by Alexander ZaitsevMigration to ClickHouse. Practical guide, by Alexander Zaitsev
Migration to ClickHouse. Practical guide, by Alexander ZaitsevAltinity Ltd
 

What's hot (20)

Apache Spark Introduction and Resilient Distributed Dataset basics and deep dive
Apache Spark Introduction and Resilient Distributed Dataset basics and deep diveApache Spark Introduction and Resilient Distributed Dataset basics and deep dive
Apache Spark Introduction and Resilient Distributed Dataset basics and deep dive
 
PostgreSQL replication
PostgreSQL replicationPostgreSQL replication
PostgreSQL replication
 
Polymorphic Table Functions in 18c
Polymorphic Table Functions in 18cPolymorphic Table Functions in 18c
Polymorphic Table Functions in 18c
 
Oracle 12c PDB insights
Oracle 12c PDB insightsOracle 12c PDB insights
Oracle 12c PDB insights
 
ClickHouse Features for Advanced Users, by Aleksei Milovidov
ClickHouse Features for Advanced Users, by Aleksei MilovidovClickHouse Features for Advanced Users, by Aleksei Milovidov
ClickHouse Features for Advanced Users, by Aleksei Milovidov
 
Troubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming ReplicationTroubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming Replication
 
Sql and Sql commands
Sql and Sql commandsSql and Sql commands
Sql and Sql commands
 
ClickHouse Mark Cache, by Mik Kocikowski, Cloudflare
ClickHouse Mark Cache, by Mik Kocikowski, CloudflareClickHouse Mark Cache, by Mik Kocikowski, Cloudflare
ClickHouse Mark Cache, by Mik Kocikowski, Cloudflare
 
XIDを周回させてみよう
XIDを周回させてみようXIDを周回させてみよう
XIDを周回させてみよう
 
PostgreSQL - Haute disponibilité avec Patroni
PostgreSQL - Haute disponibilité avec PatroniPostgreSQL - Haute disponibilité avec Patroni
PostgreSQL - Haute disponibilité avec Patroni
 
Oracle statistics by example
Oracle statistics by exampleOracle statistics by example
Oracle statistics by example
 
Same plan different performance
Same plan different performanceSame plan different performance
Same plan different performance
 
Hash join in MySQL 8
Hash join in MySQL 8Hash join in MySQL 8
Hash join in MySQL 8
 
Oracle Fleet Patching and Provisioning Deep Dive Webcast Slides
Oracle Fleet Patching and Provisioning Deep Dive Webcast SlidesOracle Fleet Patching and Provisioning Deep Dive Webcast Slides
Oracle Fleet Patching and Provisioning Deep Dive Webcast Slides
 
OpenZFS novel algorithms: snapshots, space allocation, RAID-Z - Matt Ahrens
OpenZFS novel algorithms: snapshots, space allocation, RAID-Z - Matt AhrensOpenZFS novel algorithms: snapshots, space allocation, RAID-Z - Matt Ahrens
OpenZFS novel algorithms: snapshots, space allocation, RAID-Z - Matt Ahrens
 
Webinar: Strength in Numbers: Introduction to ClickHouse Cluster Performance
Webinar: Strength in Numbers: Introduction to ClickHouse Cluster PerformanceWebinar: Strength in Numbers: Introduction to ClickHouse Cluster Performance
Webinar: Strength in Numbers: Introduction to ClickHouse Cluster Performance
 
Trigger in mysql
Trigger in mysqlTrigger in mysql
Trigger in mysql
 
All About JSON and ClickHouse - Tips, Tricks and New Features-2022-07-26-FINA...
All About JSON and ClickHouse - Tips, Tricks and New Features-2022-07-26-FINA...All About JSON and ClickHouse - Tips, Tricks and New Features-2022-07-26-FINA...
All About JSON and ClickHouse - Tips, Tricks and New Features-2022-07-26-FINA...
 
ClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEO
ClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEOClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEO
ClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEO
 
Migration to ClickHouse. Practical guide, by Alexander Zaitsev
Migration to ClickHouse. Practical guide, by Alexander ZaitsevMigration to ClickHouse. Practical guide, by Alexander Zaitsev
Migration to ClickHouse. Practical guide, by Alexander Zaitsev
 

Viewers also liked

Harnessing the Power of Optimizer Hints
Harnessing the Power of Optimizer HintsHarnessing the Power of Optimizer Hints
Harnessing the Power of Optimizer HintsMaria Colgan
 
Am I reading GC logs Correctly?
Am I reading GC logs Correctly?Am I reading GC logs Correctly?
Am I reading GC logs Correctly?Tier1 App
 
RxNetty vs Tomcat Performance Results
RxNetty vs Tomcat Performance ResultsRxNetty vs Tomcat Performance Results
RxNetty vs Tomcat Performance ResultsBrendan Gregg
 
G1 Garbage Collector: Details and Tuning
G1 Garbage Collector: Details and TuningG1 Garbage Collector: Details and Tuning
G1 Garbage Collector: Details and TuningSimone Bordet
 
Java Performance Analysis on Linux with Flame Graphs
Java Performance Analysis on Linux with Flame GraphsJava Performance Analysis on Linux with Flame Graphs
Java Performance Analysis on Linux with Flame GraphsBrendan Gregg
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出wang hongjiang
 
SREcon 2016 Performance Checklists for SREs
SREcon 2016 Performance Checklists for SREsSREcon 2016 Performance Checklists for SREs
SREcon 2016 Performance Checklists for SREsBrendan Gregg
 
Performance Tuning EC2 Instances
Performance Tuning EC2 InstancesPerformance Tuning EC2 Instances
Performance Tuning EC2 InstancesBrendan Gregg
 
Blazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBlazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBrendan Gregg
 
Linux 4.x Tracing Tools: Using BPF Superpowers
Linux 4.x Tracing Tools: Using BPF SuperpowersLinux 4.x Tracing Tools: Using BPF Superpowers
Linux 4.x Tracing Tools: Using BPF SuperpowersBrendan Gregg
 
Container Performance Analysis
Container Performance AnalysisContainer Performance Analysis
Container Performance AnalysisBrendan Gregg
 

Viewers also liked (11)

Harnessing the Power of Optimizer Hints
Harnessing the Power of Optimizer HintsHarnessing the Power of Optimizer Hints
Harnessing the Power of Optimizer Hints
 
Am I reading GC logs Correctly?
Am I reading GC logs Correctly?Am I reading GC logs Correctly?
Am I reading GC logs Correctly?
 
RxNetty vs Tomcat Performance Results
RxNetty vs Tomcat Performance ResultsRxNetty vs Tomcat Performance Results
RxNetty vs Tomcat Performance Results
 
G1 Garbage Collector: Details and Tuning
G1 Garbage Collector: Details and TuningG1 Garbage Collector: Details and Tuning
G1 Garbage Collector: Details and Tuning
 
Java Performance Analysis on Linux with Flame Graphs
Java Performance Analysis on Linux with Flame GraphsJava Performance Analysis on Linux with Flame Graphs
Java Performance Analysis on Linux with Flame Graphs
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出
 
SREcon 2016 Performance Checklists for SREs
SREcon 2016 Performance Checklists for SREsSREcon 2016 Performance Checklists for SREs
SREcon 2016 Performance Checklists for SREs
 
Performance Tuning EC2 Instances
Performance Tuning EC2 InstancesPerformance Tuning EC2 Instances
Performance Tuning EC2 Instances
 
Blazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBlazing Performance with Flame Graphs
Blazing Performance with Flame Graphs
 
Linux 4.x Tracing Tools: Using BPF Superpowers
Linux 4.x Tracing Tools: Using BPF SuperpowersLinux 4.x Tracing Tools: Using BPF Superpowers
Linux 4.x Tracing Tools: Using BPF Superpowers
 
Container Performance Analysis
Container Performance AnalysisContainer Performance Analysis
Container Performance Analysis
 

Similar to Row Pattern Matching in SQL:2016

class12_time.ppt
class12_time.pptclass12_time.ppt
class12_time.pptGauravWaila
 
The Ring programming language version 1.5.2 book - Part 23 of 181
The Ring programming language version 1.5.2 book - Part 23 of 181The Ring programming language version 1.5.2 book - Part 23 of 181
The Ring programming language version 1.5.2 book - Part 23 of 181Mahmoud Samir Fayed
 
Row patternmatching12ctech14
Row patternmatching12ctech14Row patternmatching12ctech14
Row patternmatching12ctech14stewashton
 
Formal 7– Modelling state – looking within the system at internal behaviour
Formal 7– Modelling state – looking within the system at internal behaviourFormal 7– Modelling state – looking within the system at internal behaviour
Formal 7– Modelling state – looking within the system at internal behaviourAlan Dix
 
The Ring programming language version 1.4.1 book - Part 6 of 31
The Ring programming language version 1.4.1 book - Part 6 of 31The Ring programming language version 1.4.1 book - Part 6 of 31
The Ring programming language version 1.4.1 book - Part 6 of 31Mahmoud Samir Fayed
 
The Ring programming language version 1.10 book - Part 32 of 212
The Ring programming language version 1.10 book - Part 32 of 212The Ring programming language version 1.10 book - Part 32 of 212
The Ring programming language version 1.10 book - Part 32 of 212Mahmoud Samir Fayed
 
The Ring programming language version 1.8 book - Part 28 of 202
The Ring programming language version 1.8 book - Part 28 of 202The Ring programming language version 1.8 book - Part 28 of 202
The Ring programming language version 1.8 book - Part 28 of 202Mahmoud Samir Fayed
 
The Ring programming language version 1.7 book - Part 27 of 196
The Ring programming language version 1.7 book - Part 27 of 196The Ring programming language version 1.7 book - Part 27 of 196
The Ring programming language version 1.7 book - Part 27 of 196Mahmoud Samir Fayed
 
Processes And Job Control
Processes And Job ControlProcesses And Job Control
Processes And Job Controlahmad bassiouny
 
02 order of growth
02 order of growth02 order of growth
02 order of growthHira Gul
 
The Ring programming language version 1.5.3 book - Part 23 of 184
The Ring programming language version 1.5.3 book - Part 23 of 184The Ring programming language version 1.5.3 book - Part 23 of 184
The Ring programming language version 1.5.3 book - Part 23 of 184Mahmoud Samir Fayed
 
Introduction to computing Processing and performance.pdf
Introduction to computing Processing and performance.pdfIntroduction to computing Processing and performance.pdf
Introduction to computing Processing and performance.pdfTulasiramKandula1
 
Rewriting Engine for Process Algebras
Rewriting Engine for Process AlgebrasRewriting Engine for Process Algebras
Rewriting Engine for Process AlgebrasAnatolii Kmetiuk
 

Similar to Row Pattern Matching in SQL:2016 (15)

2_2_Event_Mechanism_Chapter_2.pdf
2_2_Event_Mechanism_Chapter_2.pdf2_2_Event_Mechanism_Chapter_2.pdf
2_2_Event_Mechanism_Chapter_2.pdf
 
class12_time.ppt
class12_time.pptclass12_time.ppt
class12_time.ppt
 
The Ring programming language version 1.5.2 book - Part 23 of 181
The Ring programming language version 1.5.2 book - Part 23 of 181The Ring programming language version 1.5.2 book - Part 23 of 181
The Ring programming language version 1.5.2 book - Part 23 of 181
 
Row patternmatching12ctech14
Row patternmatching12ctech14Row patternmatching12ctech14
Row patternmatching12ctech14
 
Formal 7– Modelling state – looking within the system at internal behaviour
Formal 7– Modelling state – looking within the system at internal behaviourFormal 7– Modelling state – looking within the system at internal behaviour
Formal 7– Modelling state – looking within the system at internal behaviour
 
The Ring programming language version 1.4.1 book - Part 6 of 31
The Ring programming language version 1.4.1 book - Part 6 of 31The Ring programming language version 1.4.1 book - Part 6 of 31
The Ring programming language version 1.4.1 book - Part 6 of 31
 
The Ring programming language version 1.10 book - Part 32 of 212
The Ring programming language version 1.10 book - Part 32 of 212The Ring programming language version 1.10 book - Part 32 of 212
The Ring programming language version 1.10 book - Part 32 of 212
 
The Ring programming language version 1.8 book - Part 28 of 202
The Ring programming language version 1.8 book - Part 28 of 202The Ring programming language version 1.8 book - Part 28 of 202
The Ring programming language version 1.8 book - Part 28 of 202
 
Influxdb and time series data
Influxdb and time series dataInfluxdb and time series data
Influxdb and time series data
 
The Ring programming language version 1.7 book - Part 27 of 196
The Ring programming language version 1.7 book - Part 27 of 196The Ring programming language version 1.7 book - Part 27 of 196
The Ring programming language version 1.7 book - Part 27 of 196
 
Processes And Job Control
Processes And Job ControlProcesses And Job Control
Processes And Job Control
 
02 order of growth
02 order of growth02 order of growth
02 order of growth
 
The Ring programming language version 1.5.3 book - Part 23 of 184
The Ring programming language version 1.5.3 book - Part 23 of 184The Ring programming language version 1.5.3 book - Part 23 of 184
The Ring programming language version 1.5.3 book - Part 23 of 184
 
Introduction to computing Processing and performance.pdf
Introduction to computing Processing and performance.pdfIntroduction to computing Processing and performance.pdf
Introduction to computing Processing and performance.pdf
 
Rewriting Engine for Process Algebras
Rewriting Engine for Process AlgebrasRewriting Engine for Process Algebras
Rewriting Engine for Process Algebras
 

More from Markus Winand

Standard SQL features where PostgreSQL beats its competitors
Standard SQL features where PostgreSQL beats its competitorsStandard SQL features where PostgreSQL beats its competitors
Standard SQL features where PostgreSQL beats its competitorsMarkus Winand
 
Four* Major Database Releases of 2017 in Review
Four* Major Database Releases of 2017 in ReviewFour* Major Database Releases of 2017 in Review
Four* Major Database Releases of 2017 in ReviewMarkus Winand
 
SQL Transactions - What they are good for and how they work
SQL Transactions - What they are good for and how they workSQL Transactions - What they are good for and how they work
SQL Transactions - What they are good for and how they workMarkus Winand
 
Backend to Frontend: When database optimization affects the full stack
Backend to Frontend: When database optimization affects the full stackBackend to Frontend: When database optimization affects the full stack
Backend to Frontend: When database optimization affects the full stackMarkus Winand
 
Volkskrankheit "Stiefmuetterliche Indizierung"
Volkskrankheit "Stiefmuetterliche Indizierung"Volkskrankheit "Stiefmuetterliche Indizierung"
Volkskrankheit "Stiefmuetterliche Indizierung"Markus Winand
 
SQL Performance - Vienna System Architects Meetup 20131202
SQL Performance - Vienna System Architects Meetup 20131202SQL Performance - Vienna System Architects Meetup 20131202
SQL Performance - Vienna System Architects Meetup 20131202Markus Winand
 
Indexes: The neglected performance all rounder
Indexes: The neglected performance all rounderIndexes: The neglected performance all rounder
Indexes: The neglected performance all rounderMarkus Winand
 
Pagination Done the Right Way
Pagination Done the Right WayPagination Done the Right Way
Pagination Done the Right WayMarkus Winand
 

More from Markus Winand (8)

Standard SQL features where PostgreSQL beats its competitors
Standard SQL features where PostgreSQL beats its competitorsStandard SQL features where PostgreSQL beats its competitors
Standard SQL features where PostgreSQL beats its competitors
 
Four* Major Database Releases of 2017 in Review
Four* Major Database Releases of 2017 in ReviewFour* Major Database Releases of 2017 in Review
Four* Major Database Releases of 2017 in Review
 
SQL Transactions - What they are good for and how they work
SQL Transactions - What they are good for and how they workSQL Transactions - What they are good for and how they work
SQL Transactions - What they are good for and how they work
 
Backend to Frontend: When database optimization affects the full stack
Backend to Frontend: When database optimization affects the full stackBackend to Frontend: When database optimization affects the full stack
Backend to Frontend: When database optimization affects the full stack
 
Volkskrankheit "Stiefmuetterliche Indizierung"
Volkskrankheit "Stiefmuetterliche Indizierung"Volkskrankheit "Stiefmuetterliche Indizierung"
Volkskrankheit "Stiefmuetterliche Indizierung"
 
SQL Performance - Vienna System Architects Meetup 20131202
SQL Performance - Vienna System Architects Meetup 20131202SQL Performance - Vienna System Architects Meetup 20131202
SQL Performance - Vienna System Architects Meetup 20131202
 
Indexes: The neglected performance all rounder
Indexes: The neglected performance all rounderIndexes: The neglected performance all rounder
Indexes: The neglected performance all rounder
 
Pagination Done the Right Way
Pagination Done the Right WayPagination Done the Right Way
Pagination Done the Right Way
 

Recently uploaded

Data Analysis Project : Targeting the Right Customers, Presentation on Bank M...
Data Analysis Project : Targeting the Right Customers, Presentation on Bank M...Data Analysis Project : Targeting the Right Customers, Presentation on Bank M...
Data Analysis Project : Targeting the Right Customers, Presentation on Bank M...Boston Institute of Analytics
 
Real-Time AI Streaming - AI Max Princeton
Real-Time AI  Streaming - AI Max PrincetonReal-Time AI  Streaming - AI Max Princeton
Real-Time AI Streaming - AI Max PrincetonTimothy Spann
 
毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree
毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree
毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degreeyuu sss
 
专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改
专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改
专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改yuu sss
 
Consent & Privacy Signals on Google *Pixels* - MeasureCamp Amsterdam 2024
Consent & Privacy Signals on Google *Pixels* - MeasureCamp Amsterdam 2024Consent & Privacy Signals on Google *Pixels* - MeasureCamp Amsterdam 2024
Consent & Privacy Signals on Google *Pixels* - MeasureCamp Amsterdam 2024thyngster
 
SWOT Analysis Slides Powerpoint Template.pptx
SWOT Analysis Slides Powerpoint Template.pptxSWOT Analysis Slides Powerpoint Template.pptx
SWOT Analysis Slides Powerpoint Template.pptxviniciusperissetr
 
Thiophen Mechanism khhjjjjjjjhhhhhhhhhhh
Thiophen Mechanism khhjjjjjjjhhhhhhhhhhhThiophen Mechanism khhjjjjjjjhhhhhhhhhhh
Thiophen Mechanism khhjjjjjjjhhhhhhhhhhhYasamin16
 
Easter Eggs From Star Wars and in cars 1 and 2
Easter Eggs From Star Wars and in cars 1 and 2Easter Eggs From Star Wars and in cars 1 and 2
Easter Eggs From Star Wars and in cars 1 and 217djon017
 
MK KOMUNIKASI DATA (TI)komdat komdat.docx
MK KOMUNIKASI DATA (TI)komdat komdat.docxMK KOMUNIKASI DATA (TI)komdat komdat.docx
MK KOMUNIKASI DATA (TI)komdat komdat.docxUnduhUnggah1
 
办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一
办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一
办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一F La
 
办理(UWIC毕业证书)英国卡迪夫城市大学毕业证成绩单原版一比一
办理(UWIC毕业证书)英国卡迪夫城市大学毕业证成绩单原版一比一办理(UWIC毕业证书)英国卡迪夫城市大学毕业证成绩单原版一比一
办理(UWIC毕业证书)英国卡迪夫城市大学毕业证成绩单原版一比一F La
 
Decoding the Heart: Student Presentation on Heart Attack Prediction with Data...
Decoding the Heart: Student Presentation on Heart Attack Prediction with Data...Decoding the Heart: Student Presentation on Heart Attack Prediction with Data...
Decoding the Heart: Student Presentation on Heart Attack Prediction with Data...Boston Institute of Analytics
 
Conf42-LLM_Adding Generative AI to Real-Time Streaming Pipelines
Conf42-LLM_Adding Generative AI to Real-Time Streaming PipelinesConf42-LLM_Adding Generative AI to Real-Time Streaming Pipelines
Conf42-LLM_Adding Generative AI to Real-Time Streaming PipelinesTimothy Spann
 
办美国阿肯色大学小石城分校毕业证成绩单pdf电子版制作修改#真实留信入库#永久存档#真实可查#diploma#degree
办美国阿肯色大学小石城分校毕业证成绩单pdf电子版制作修改#真实留信入库#永久存档#真实可查#diploma#degree办美国阿肯色大学小石城分校毕业证成绩单pdf电子版制作修改#真实留信入库#永久存档#真实可查#diploma#degree
办美国阿肯色大学小石城分校毕业证成绩单pdf电子版制作修改#真实留信入库#永久存档#真实可查#diploma#degreeyuu sss
 
How we prevented account sharing with MFA
How we prevented account sharing with MFAHow we prevented account sharing with MFA
How we prevented account sharing with MFAAndrei Kaleshka
 
Advanced Machine Learning for Business Professionals
Advanced Machine Learning for Business ProfessionalsAdvanced Machine Learning for Business Professionals
Advanced Machine Learning for Business ProfessionalsVICTOR MAESTRE RAMIREZ
 
Multiple time frame trading analysis -brianshannon.pdf
Multiple time frame trading analysis -brianshannon.pdfMultiple time frame trading analysis -brianshannon.pdf
Multiple time frame trading analysis -brianshannon.pdfchwongval
 
在线办理WLU毕业证罗瑞尔大学毕业证成绩单留信学历认证
在线办理WLU毕业证罗瑞尔大学毕业证成绩单留信学历认证在线办理WLU毕业证罗瑞尔大学毕业证成绩单留信学历认证
在线办理WLU毕业证罗瑞尔大学毕业证成绩单留信学历认证nhjeo1gg
 
NO1 Certified Black Magic Specialist Expert Amil baba in Lahore Islamabad Raw...
NO1 Certified Black Magic Specialist Expert Amil baba in Lahore Islamabad Raw...NO1 Certified Black Magic Specialist Expert Amil baba in Lahore Islamabad Raw...
NO1 Certified Black Magic Specialist Expert Amil baba in Lahore Islamabad Raw...Amil Baba Dawood bangali
 
Defining Constituents, Data Vizzes and Telling a Data Story
Defining Constituents, Data Vizzes and Telling a Data StoryDefining Constituents, Data Vizzes and Telling a Data Story
Defining Constituents, Data Vizzes and Telling a Data StoryJeremy Anderson
 

Recently uploaded (20)

Data Analysis Project : Targeting the Right Customers, Presentation on Bank M...
Data Analysis Project : Targeting the Right Customers, Presentation on Bank M...Data Analysis Project : Targeting the Right Customers, Presentation on Bank M...
Data Analysis Project : Targeting the Right Customers, Presentation on Bank M...
 
Real-Time AI Streaming - AI Max Princeton
Real-Time AI  Streaming - AI Max PrincetonReal-Time AI  Streaming - AI Max Princeton
Real-Time AI Streaming - AI Max Princeton
 
毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree
毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree
毕业文凭制作#回国入职#diploma#degree澳洲中央昆士兰大学毕业证成绩单pdf电子版制作修改#毕业文凭制作#回国入职#diploma#degree
 
专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改
专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改
专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改
 
Consent & Privacy Signals on Google *Pixels* - MeasureCamp Amsterdam 2024
Consent & Privacy Signals on Google *Pixels* - MeasureCamp Amsterdam 2024Consent & Privacy Signals on Google *Pixels* - MeasureCamp Amsterdam 2024
Consent & Privacy Signals on Google *Pixels* - MeasureCamp Amsterdam 2024
 
SWOT Analysis Slides Powerpoint Template.pptx
SWOT Analysis Slides Powerpoint Template.pptxSWOT Analysis Slides Powerpoint Template.pptx
SWOT Analysis Slides Powerpoint Template.pptx
 
Thiophen Mechanism khhjjjjjjjhhhhhhhhhhh
Thiophen Mechanism khhjjjjjjjhhhhhhhhhhhThiophen Mechanism khhjjjjjjjhhhhhhhhhhh
Thiophen Mechanism khhjjjjjjjhhhhhhhhhhh
 
Easter Eggs From Star Wars and in cars 1 and 2
Easter Eggs From Star Wars and in cars 1 and 2Easter Eggs From Star Wars and in cars 1 and 2
Easter Eggs From Star Wars and in cars 1 and 2
 
MK KOMUNIKASI DATA (TI)komdat komdat.docx
MK KOMUNIKASI DATA (TI)komdat komdat.docxMK KOMUNIKASI DATA (TI)komdat komdat.docx
MK KOMUNIKASI DATA (TI)komdat komdat.docx
 
办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一
办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一
办理(Vancouver毕业证书)加拿大温哥华岛大学毕业证成绩单原版一比一
 
办理(UWIC毕业证书)英国卡迪夫城市大学毕业证成绩单原版一比一
办理(UWIC毕业证书)英国卡迪夫城市大学毕业证成绩单原版一比一办理(UWIC毕业证书)英国卡迪夫城市大学毕业证成绩单原版一比一
办理(UWIC毕业证书)英国卡迪夫城市大学毕业证成绩单原版一比一
 
Decoding the Heart: Student Presentation on Heart Attack Prediction with Data...
Decoding the Heart: Student Presentation on Heart Attack Prediction with Data...Decoding the Heart: Student Presentation on Heart Attack Prediction with Data...
Decoding the Heart: Student Presentation on Heart Attack Prediction with Data...
 
Conf42-LLM_Adding Generative AI to Real-Time Streaming Pipelines
Conf42-LLM_Adding Generative AI to Real-Time Streaming PipelinesConf42-LLM_Adding Generative AI to Real-Time Streaming Pipelines
Conf42-LLM_Adding Generative AI to Real-Time Streaming Pipelines
 
办美国阿肯色大学小石城分校毕业证成绩单pdf电子版制作修改#真实留信入库#永久存档#真实可查#diploma#degree
办美国阿肯色大学小石城分校毕业证成绩单pdf电子版制作修改#真实留信入库#永久存档#真实可查#diploma#degree办美国阿肯色大学小石城分校毕业证成绩单pdf电子版制作修改#真实留信入库#永久存档#真实可查#diploma#degree
办美国阿肯色大学小石城分校毕业证成绩单pdf电子版制作修改#真实留信入库#永久存档#真实可查#diploma#degree
 
How we prevented account sharing with MFA
How we prevented account sharing with MFAHow we prevented account sharing with MFA
How we prevented account sharing with MFA
 
Advanced Machine Learning for Business Professionals
Advanced Machine Learning for Business ProfessionalsAdvanced Machine Learning for Business Professionals
Advanced Machine Learning for Business Professionals
 
Multiple time frame trading analysis -brianshannon.pdf
Multiple time frame trading analysis -brianshannon.pdfMultiple time frame trading analysis -brianshannon.pdf
Multiple time frame trading analysis -brianshannon.pdf
 
在线办理WLU毕业证罗瑞尔大学毕业证成绩单留信学历认证
在线办理WLU毕业证罗瑞尔大学毕业证成绩单留信学历认证在线办理WLU毕业证罗瑞尔大学毕业证成绩单留信学历认证
在线办理WLU毕业证罗瑞尔大学毕业证成绩单留信学历认证
 
NO1 Certified Black Magic Specialist Expert Amil baba in Lahore Islamabad Raw...
NO1 Certified Black Magic Specialist Expert Amil baba in Lahore Islamabad Raw...NO1 Certified Black Magic Specialist Expert Amil baba in Lahore Islamabad Raw...
NO1 Certified Black Magic Specialist Expert Amil baba in Lahore Islamabad Raw...
 
Defining Constituents, Data Vizzes and Telling a Data Story
Defining Constituents, Data Vizzes and Telling a Data StoryDefining Constituents, Data Vizzes and Telling a Data Story
Defining Constituents, Data Vizzes and Telling a Data Story
 

Row Pattern Matching in SQL:2016