SlideShare une entreprise Scribd logo
1  sur  92
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

Low Level CPU Performance Profiling Examples
Low Level CPU Performance Profiling ExamplesLow Level CPU Performance Profiling Examples
Low Level CPU Performance Profiling ExamplesTanel Poder
 
Spark SQL Deep Dive @ Melbourne Spark Meetup
Spark SQL Deep Dive @ Melbourne Spark MeetupSpark SQL Deep Dive @ Melbourne Spark Meetup
Spark SQL Deep Dive @ Melbourne Spark MeetupDatabricks
 
Enabling Vectorized Engine in Apache Spark
Enabling Vectorized Engine in Apache SparkEnabling Vectorized Engine in Apache Spark
Enabling Vectorized Engine in Apache SparkKazuaki Ishizaki
 
UKOUG, Oracle Transaction Locks
UKOUG, Oracle Transaction LocksUKOUG, Oracle Transaction Locks
UKOUG, Oracle Transaction LocksKyle Hailey
 
Oracle Database SQL Tuning Concept
Oracle Database SQL Tuning ConceptOracle Database SQL Tuning Concept
Oracle Database SQL Tuning ConceptChien Chung Shen
 
Awr + 12c performance tuning
Awr + 12c performance tuningAwr + 12c performance tuning
Awr + 12c performance tuningAiougVizagChapter
 
Oracle RAC 12c Practical Performance Management and Tuning OOW13 [CON8825]
Oracle RAC 12c Practical Performance Management and Tuning OOW13 [CON8825]Oracle RAC 12c Practical Performance Management and Tuning OOW13 [CON8825]
Oracle RAC 12c Practical Performance Management and Tuning OOW13 [CON8825]Markus Michalewicz
 
How to Analyze and Tune MySQL Queries for Better Performance
How to Analyze and Tune MySQL Queries for Better PerformanceHow to Analyze and Tune MySQL Queries for Better Performance
How to Analyze and Tune MySQL Queries for Better Performanceoysteing
 
Getting started with postgresql
Getting started with postgresqlGetting started with postgresql
Getting started with postgresqlbotsplash.com
 
Tanel Poder - Performance stories from Exadata Migrations
Tanel Poder - Performance stories from Exadata MigrationsTanel Poder - Performance stories from Exadata Migrations
Tanel Poder - Performance stories from Exadata MigrationsTanel Poder
 
All about Zookeeper and ClickHouse Keeper.pdf
All about Zookeeper and ClickHouse Keeper.pdfAll about Zookeeper and ClickHouse Keeper.pdf
All about Zookeeper and ClickHouse Keeper.pdfAltinity Ltd
 
A Deep Dive into Query Execution Engine of Spark SQL
A Deep Dive into Query Execution Engine of Spark SQLA Deep Dive into Query Execution Engine of Spark SQL
A Deep Dive into Query Execution Engine of Spark SQLDatabricks
 
Webinar: Secrets of ClickHouse Query Performance, by Robert Hodges
Webinar: Secrets of ClickHouse Query Performance, by Robert HodgesWebinar: Secrets of ClickHouse Query Performance, by Robert Hodges
Webinar: Secrets of ClickHouse Query Performance, by Robert HodgesAltinity Ltd
 
Tanel Poder - Scripts and Tools short
Tanel Poder - Scripts and Tools shortTanel Poder - Scripts and Tools short
Tanel Poder - Scripts and Tools shortTanel Poder
 
Deep Dive into Spark SQL with Advanced Performance Tuning with Xiao Li & Wenc...
Deep Dive into Spark SQL with Advanced Performance Tuning with Xiao Li & Wenc...Deep Dive into Spark SQL with Advanced Performance Tuning with Xiao Li & Wenc...
Deep Dive into Spark SQL with Advanced Performance Tuning with Xiao Li & Wenc...Databricks
 
A Day in the Life of a ClickHouse Query Webinar Slides
A Day in the Life of a ClickHouse Query Webinar Slides A Day in the Life of a ClickHouse Query Webinar Slides
A Day in the Life of a ClickHouse Query Webinar Slides Altinity Ltd
 
High Performance, High Reliability Data Loading on ClickHouse
High Performance, High Reliability Data Loading on ClickHouseHigh Performance, High Reliability Data Loading on ClickHouse
High Performance, High Reliability Data Loading on ClickHouseAltinity Ltd
 

Tendances (20)

Low Level CPU Performance Profiling Examples
Low Level CPU Performance Profiling ExamplesLow Level CPU Performance Profiling Examples
Low Level CPU Performance Profiling Examples
 
Spark SQL Deep Dive @ Melbourne Spark Meetup
Spark SQL Deep Dive @ Melbourne Spark MeetupSpark SQL Deep Dive @ Melbourne Spark Meetup
Spark SQL Deep Dive @ Melbourne Spark Meetup
 
Enabling Vectorized Engine in Apache Spark
Enabling Vectorized Engine in Apache SparkEnabling Vectorized Engine in Apache Spark
Enabling Vectorized Engine in Apache Spark
 
SQLd360
SQLd360SQLd360
SQLd360
 
UKOUG, Oracle Transaction Locks
UKOUG, Oracle Transaction LocksUKOUG, Oracle Transaction Locks
UKOUG, Oracle Transaction Locks
 
Oracle Database SQL Tuning Concept
Oracle Database SQL Tuning ConceptOracle Database SQL Tuning Concept
Oracle Database SQL Tuning Concept
 
Awr + 12c performance tuning
Awr + 12c performance tuningAwr + 12c performance tuning
Awr + 12c performance tuning
 
Oracle RAC 12c Practical Performance Management and Tuning OOW13 [CON8825]
Oracle RAC 12c Practical Performance Management and Tuning OOW13 [CON8825]Oracle RAC 12c Practical Performance Management and Tuning OOW13 [CON8825]
Oracle RAC 12c Practical Performance Management and Tuning OOW13 [CON8825]
 
How to Analyze and Tune MySQL Queries for Better Performance
How to Analyze and Tune MySQL Queries for Better PerformanceHow to Analyze and Tune MySQL Queries for Better Performance
How to Analyze and Tune MySQL Queries for Better Performance
 
Getting started with postgresql
Getting started with postgresqlGetting started with postgresql
Getting started with postgresql
 
Hive: Loading Data
Hive: Loading DataHive: Loading Data
Hive: Loading Data
 
Tanel Poder - Performance stories from Exadata Migrations
Tanel Poder - Performance stories from Exadata MigrationsTanel Poder - Performance stories from Exadata Migrations
Tanel Poder - Performance stories from Exadata Migrations
 
High Performance PL/SQL
High Performance PL/SQLHigh Performance PL/SQL
High Performance PL/SQL
 
All about Zookeeper and ClickHouse Keeper.pdf
All about Zookeeper and ClickHouse Keeper.pdfAll about Zookeeper and ClickHouse Keeper.pdf
All about Zookeeper and ClickHouse Keeper.pdf
 
A Deep Dive into Query Execution Engine of Spark SQL
A Deep Dive into Query Execution Engine of Spark SQLA Deep Dive into Query Execution Engine of Spark SQL
A Deep Dive into Query Execution Engine of Spark SQL
 
Webinar: Secrets of ClickHouse Query Performance, by Robert Hodges
Webinar: Secrets of ClickHouse Query Performance, by Robert HodgesWebinar: Secrets of ClickHouse Query Performance, by Robert Hodges
Webinar: Secrets of ClickHouse Query Performance, by Robert Hodges
 
Tanel Poder - Scripts and Tools short
Tanel Poder - Scripts and Tools shortTanel Poder - Scripts and Tools short
Tanel Poder - Scripts and Tools short
 
Deep Dive into Spark SQL with Advanced Performance Tuning with Xiao Li & Wenc...
Deep Dive into Spark SQL with Advanced Performance Tuning with Xiao Li & Wenc...Deep Dive into Spark SQL with Advanced Performance Tuning with Xiao Li & Wenc...
Deep Dive into Spark SQL with Advanced Performance Tuning with Xiao Li & Wenc...
 
A Day in the Life of a ClickHouse Query Webinar Slides
A Day in the Life of a ClickHouse Query Webinar Slides A Day in the Life of a ClickHouse Query Webinar Slides
A Day in the Life of a ClickHouse Query Webinar Slides
 
High Performance, High Reliability Data Loading on ClickHouse
High Performance, High Reliability Data Loading on ClickHouseHigh Performance, High Reliability Data Loading on ClickHouse
High Performance, High Reliability Data Loading on ClickHouse
 

En vedette

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
 
Troubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming ReplicationTroubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming ReplicationAlexey Lesovsky
 
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
 

En vedette (12)

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
 
Troubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming ReplicationTroubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming Replication
 
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
 

Similaire à 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
 
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
 

Similaire à Row Pattern Matching in SQL:2016 (14)

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
 
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
 

Plus de 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
 

Plus de 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
 

Dernier

Generative AI for Social Good at Open Data Science East 2024
Generative AI for Social Good at Open Data Science East 2024Generative AI for Social Good at Open Data Science East 2024
Generative AI for Social Good at Open Data Science East 2024Colleen Farrelly
 
20240419 - Measurecamp Amsterdam - SAM.pdf
20240419 - Measurecamp Amsterdam - SAM.pdf20240419 - Measurecamp Amsterdam - SAM.pdf
20240419 - Measurecamp Amsterdam - SAM.pdfHuman37
 
Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...
Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...
Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...Sapana Sha
 
Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)
Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)
Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)jennyeacort
 
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
 
原版1:1定制南十字星大学毕业证(SCU毕业证)#文凭成绩单#真实留信学历认证永久存档
原版1:1定制南十字星大学毕业证(SCU毕业证)#文凭成绩单#真实留信学历认证永久存档原版1:1定制南十字星大学毕业证(SCU毕业证)#文凭成绩单#真实留信学历认证永久存档
原版1:1定制南十字星大学毕业证(SCU毕业证)#文凭成绩单#真实留信学历认证永久存档208367051
 
专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改
专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改
专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改yuu sss
 
9654467111 Call Girls In Munirka Hotel And Home Service
9654467111 Call Girls In Munirka Hotel And Home Service9654467111 Call Girls In Munirka Hotel And Home Service
9654467111 Call Girls In Munirka Hotel And Home ServiceSapana Sha
 
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
 
Heart Disease Classification Report: A Data Analysis Project
Heart Disease Classification Report: A Data Analysis ProjectHeart Disease Classification Report: A Data Analysis Project
Heart Disease Classification Report: A Data Analysis ProjectBoston Institute of Analytics
 
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
 
Customer Service Analytics - Make Sense of All Your Data.pptx
Customer Service Analytics - Make Sense of All Your Data.pptxCustomer Service Analytics - Make Sense of All Your Data.pptx
Customer Service Analytics - Make Sense of All Your Data.pptxEmmanuel Dauda
 
Predicting Salary Using Data Science: A Comprehensive Analysis.pdf
Predicting Salary Using Data Science: A Comprehensive Analysis.pdfPredicting Salary Using Data Science: A Comprehensive Analysis.pdf
Predicting Salary Using Data Science: A Comprehensive Analysis.pdfBoston Institute of Analytics
 
High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...
High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...
High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...soniya singh
 
1:1定制(UQ毕业证)昆士兰大学毕业证成绩单修改留信学历认证原版一模一样
1:1定制(UQ毕业证)昆士兰大学毕业证成绩单修改留信学历认证原版一模一样1:1定制(UQ毕业证)昆士兰大学毕业证成绩单修改留信学历认证原版一模一样
1:1定制(UQ毕业证)昆士兰大学毕业证成绩单修改留信学历认证原版一模一样vhwb25kk
 
From idea to production in a day – Leveraging Azure ML and Streamlit to build...
From idea to production in a day – Leveraging Azure ML and Streamlit to build...From idea to production in a day – Leveraging Azure ML and Streamlit to build...
From idea to production in a day – Leveraging Azure ML and Streamlit to build...Florian Roscheck
 
IMA MSN - Medical Students Network (2).pptx
IMA MSN - Medical Students Network (2).pptxIMA MSN - Medical Students Network (2).pptx
IMA MSN - Medical Students Network (2).pptxdolaknnilon
 
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
 
GA4 Without Cookies [Measure Camp AMS]
GA4 Without Cookies [Measure Camp AMS]GA4 Without Cookies [Measure Camp AMS]
GA4 Without Cookies [Measure Camp AMS]📊 Markus Baersch
 

Dernier (20)

Generative AI for Social Good at Open Data Science East 2024
Generative AI for Social Good at Open Data Science East 2024Generative AI for Social Good at Open Data Science East 2024
Generative AI for Social Good at Open Data Science East 2024
 
20240419 - Measurecamp Amsterdam - SAM.pdf
20240419 - Measurecamp Amsterdam - SAM.pdf20240419 - Measurecamp Amsterdam - SAM.pdf
20240419 - Measurecamp Amsterdam - SAM.pdf
 
Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...
Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...
Saket, (-DELHI )+91-9654467111-(=)CHEAP Call Girls in Escorts Service Saket C...
 
Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)
Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)
Call Us ➥97111√47426🤳Call Girls in Aerocity (Delhi NCR)
 
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
 
原版1:1定制南十字星大学毕业证(SCU毕业证)#文凭成绩单#真实留信学历认证永久存档
原版1:1定制南十字星大学毕业证(SCU毕业证)#文凭成绩单#真实留信学历认证永久存档原版1:1定制南十字星大学毕业证(SCU毕业证)#文凭成绩单#真实留信学历认证永久存档
原版1:1定制南十字星大学毕业证(SCU毕业证)#文凭成绩单#真实留信学历认证永久存档
 
专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改
专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改
专业一比一美国俄亥俄大学毕业证成绩单pdf电子版制作修改
 
9654467111 Call Girls In Munirka Hotel And Home Service
9654467111 Call Girls In Munirka Hotel And Home Service9654467111 Call Girls In Munirka Hotel And Home Service
9654467111 Call Girls In Munirka Hotel And Home Service
 
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
 
Heart Disease Classification Report: A Data Analysis Project
Heart Disease Classification Report: A Data Analysis ProjectHeart Disease Classification Report: A Data Analysis Project
Heart Disease Classification Report: A Data Analysis Project
 
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
 
Customer Service Analytics - Make Sense of All Your Data.pptx
Customer Service Analytics - Make Sense of All Your Data.pptxCustomer Service Analytics - Make Sense of All Your Data.pptx
Customer Service Analytics - Make Sense of All Your Data.pptx
 
Predicting Salary Using Data Science: A Comprehensive Analysis.pdf
Predicting Salary Using Data Science: A Comprehensive Analysis.pdfPredicting Salary Using Data Science: A Comprehensive Analysis.pdf
Predicting Salary Using Data Science: A Comprehensive Analysis.pdf
 
High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...
High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...
High Class Call Girls Noida Sector 39 Aarushi 🔝8264348440🔝 Independent Escort...
 
1:1定制(UQ毕业证)昆士兰大学毕业证成绩单修改留信学历认证原版一模一样
1:1定制(UQ毕业证)昆士兰大学毕业证成绩单修改留信学历认证原版一模一样1:1定制(UQ毕业证)昆士兰大学毕业证成绩单修改留信学历认证原版一模一样
1:1定制(UQ毕业证)昆士兰大学毕业证成绩单修改留信学历认证原版一模一样
 
From idea to production in a day – Leveraging Azure ML and Streamlit to build...
From idea to production in a day – Leveraging Azure ML and Streamlit to build...From idea to production in a day – Leveraging Azure ML and Streamlit to build...
From idea to production in a day – Leveraging Azure ML and Streamlit to build...
 
IMA MSN - Medical Students Network (2).pptx
IMA MSN - Medical Students Network (2).pptxIMA MSN - Medical Students Network (2).pptx
IMA MSN - Medical Students Network (2).pptx
 
E-Commerce Order PredictionShraddha Kamble.pptx
E-Commerce Order PredictionShraddha Kamble.pptxE-Commerce Order PredictionShraddha Kamble.pptx
E-Commerce Order PredictionShraddha Kamble.pptx
 
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
 
GA4 Without Cookies [Measure Camp AMS]
GA4 Without Cookies [Measure Camp AMS]GA4 Without Cookies [Measure Camp AMS]
GA4 Without Cookies [Measure Camp AMS]
 

Row Pattern Matching in SQL:2016