MATCH_RECOGNIZE yan tümcesi

Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL denetimi evet olarak işaretlendi Databricks Runtime 19.0 ve üzeri

Important

Bu özellik Beta sürümündedir. Çalışma alanı yöneticileri Bu özelliğe erişimi Önizlemeler sayfasından denetleyebilir. Bkz. Azure Databricks önizlemelerini yönetme.

Önceki table_reference satırlarındaki desenleri bulur ve filtreler. MATCH_RECOGNIZE girişi bölümler, her bölümdeki satırları sıralar, sıralı diziye göre bir satır düzeniyle eşleşir ve eşleşme başına satır başına satır moduna bağlı olarak özet veya satır başına sonuçlar döndürür.

Tipik kullanımlar arasında ardışık değerlerin çalıştırmalarını algılama, V şeklinde veya W şeklindeki fiyat hareketlerini algılama ve olay akışlarını oturum açma sayılabilir.

Syntax

MATCH_RECOGNIZE (
  [ PARTITION BY partition [, ...] ]
  [ ORDER BY order_by ]
  [ MEASURES measures ]
  [ row_pattern_rows_per_match ]
  [ AFTER MATCH row_pattern_skip_to ]
  PATTERN ( row_pattern )
  DEFINE row_pattern_definition_list )
measures
  MEASURES { measureExpr AS measureName } [, ...]

row_pattern_rows_per_match
  { ONE ROW PER MATCH
  | ALL ROWS PER MATCH [ SHOW EMPTY MATCHES ] }

row_pattern_skip_to
  SKIP PAST LAST ROW

Parameters

  • PARTITION BY bölümü [, ...]

    Desen eşleştirmenin çalıştığı satır gruplarını tanımlayan bir veya daha fazla ifade. atlarsanız PARTITION BY, bölümü tüm satırları içerir.

    PARTITION BY yalnızca sütun başvurularını kabul eder. Başka bir ifade belirtirseniz, Azure Databricks MATCH_RECOGNIZE_PARTITION_BY_MUST_BE_COLUMN yükseltir.

  • ORDER BY order_by

    Her bölüm içindeki satırların sırasını belirtir. Desen eşleştirme ve gezinti işlevleri bu sırayı kullanır.

  • ÖNLEM -LER

    İsteğe bağlı olarak, her desen eşleşmesi için döndürülen ölçü sütunlarını tanımlar.

  • row_pattern_rows_per_match

    Eşleşme başına kaç satır döndürülür denetler. Varsayılan değer: ONE ROW PER MATCH.

    • ONE ROW PER MATCH

      Eşleşme başına bir satır döndürür. Sonuç yalnızca bölüm sütunlarını ve ölçü sütunlarını içerir.

    • ALL ROWS PER MATCH [ SHOW EMPTY MATCHES ]

      Bir eşleşmeye katılan her satır için bir satır döndürür. Her çıkış satırı, ilgili eşleşme için hesaplanan , table_reference sütunlarından ve PARTITION BY sütunlarından MEASURESilgili giriş sütunlarını içerir.

      SHOW EMPTY MATCHES altında ALL ROWS PER MATCHkabul edilir ve empty-match-handling alt yan tümcesini atladığınızda varsayılan değerdir. Bu sürüm boş eşleşmeler oluşturmaz, bu nedenle anahtar sözcüğün sonuç üzerinde gözlemlenebilir bir etkisi yoktur.

  • EŞLEŞME SONRASI row_pattern_skip_to

    Eşleşme bulunduktan sonra devam etmek istediğiniz satırı belirtir. Bu sürüm yalnızca destekler SKIP PAST LAST ROW . Geçerli eşleşmenin son satırının hemen ardından satırla devam edin. Yan tümcesini atladığınızda varsayılan değer AFTER MATCH budur.

  • PATTERN ( row_pattern )

    Eşleşecek deseni belirtir.

  • DEFINE row_pattern_definition_list

    ve PATTERN yan tümcelerinde MEASURES başvuruda bulunan boole değişkenlerini tanımlar.

Result

Sonuç, eşleşme başına satır moduna bağlıdır:

  • ONE ROW PER MATCH

    Sütunları ve ardından PARTITION BY sütunları döndürürMEASURES.

  • ALL ROWS PER MATCH

    Bir eşleşmeye katılan her satır için bir satır döndürür. Her çıkış satırı, ilgili eşleşme için hesaplanan , table_reference sütunlarından ve PARTITION BY sütunlarından MEASURESilgili giriş sütunlarını içerir.

Yaygın hata koşulları

Examples

Her sorgu, kullanan son örnek dışında bir stock_ticker(symbol, tstamp, price) tablo kullanır page_views(user_id, event_time).

Örnek 1: Ardışık artan çalıştırma

Sembol başına ardışık fiyat artışlarının her en üst düzey çalıştırmasını bulun. Değişkenin strt girdisi olmadığından DEFINE , herhangi bir satırla eşleşir ve çalıştırmayı sabitler. up+ eşleşmeyi art arda bir veya daha fazla artışa genişletir. PREV(price) hemen önceki satırın ORDER BY fiyatını sırayla okur. ONE ROW PER MATCH çalıştırma başına tek bir özet satırı yayar.

> CREATE OR REPLACE TEMP VIEW stock_ticker AS
  SELECT * FROM VALUES
    ('AAPL', TIMESTAMP '2024-01-01 09:30:00', 100.0),
    ('AAPL', TIMESTAMP '2024-01-01 09:31:00', 102.0),
    ('AAPL', TIMESTAMP '2024-01-01 09:32:00', 105.0),
    ('AAPL', TIMESTAMP '2024-01-01 09:33:00', 104.0),
    ('AAPL', TIMESTAMP '2024-01-01 09:34:00', 106.0),
    ('AAPL', TIMESTAMP '2024-01-01 09:35:00', 108.0)
  AS t(symbol, tstamp, price);

> SELECT symbol, start_tstamp, end_tstamp, run_length
  FROM stock_ticker
  MATCH_RECOGNIZE (
    PARTITION BY symbol
    ORDER BY tstamp
    MEASURES FIRST(tstamp) AS start_tstamp,
             LAST(tstamp)  AS end_tstamp,
             COUNT(*)      AS run_length
    ONE ROW PER MATCH
    AFTER MATCH SKIP PAST LAST ROW
    PATTERN ( strt up+ )
    DEFINE up AS price > PREV(price) ) AS T;
 symbol  start_tstamp           end_tstamp             run_length
 AAPL    2024-01-01 09:30:00    2024-01-01 09:32:00    3
 AAPL    2024-01-01 09:33:00    2024-01-01 09:35:00    3

Örnek 2: V şekli (dip ve kurtarma)

Önce düşen, sonra yükselen bir fiyatı algılayın. down+ düşen bacak ve up+ iyileşme ile eşleşir. LAST(down.tstamp) olarak downsınıflandırılan son satırı seçer; bu, V'nin yayıdır. gibi down.tstamp bir değişken nitelikli başvuru, ifadenin belirli bir MEASURES desen değişkeniyle eşleşen satırları okumasına olanak tanır.

> SELECT symbol, start_tstamp, bottom_tstamp, end_tstamp
  FROM stock_ticker
  MATCH_RECOGNIZE (
    PARTITION BY symbol
    ORDER BY tstamp
    MEASURES FIRST(tstamp)     AS start_tstamp,
             LAST(down.tstamp) AS bottom_tstamp,
             LAST(tstamp)      AS end_tstamp
    ONE ROW PER MATCH
    AFTER MATCH SKIP PAST LAST ROW
    PATTERN ( strt down+ up+ )
    DEFINE down AS price < PREV(price),
           up   AS price > PREV(price) ) AS T;
 symbol  start_tstamp           bottom_tstamp          end_tstamp
 AAPL    2024-01-01 09:32:00    2024-01-01 09:33:00    2024-01-01 09:35:00

Örnek 3: Çift alt (W-shape)

Kısmi kurtarma ile ayrılmış iki dip algılayın. Desen dört bacak (down1+ up1+ down2+ up2+ ) şeklindedir ve farklı değişken adları her oluğu bağımsız olarak ölçmenize veya filtrelemenize olanak sağlar. MATCH_NUMBER() bir bölümde bulunan her W'i numaralar.

> CREATE OR REPLACE TEMP VIEW stock_ticker AS
  SELECT * FROM VALUES
    ('AAPL', TIMESTAMP '2024-01-01 09:30:00', 100.0),
    ('AAPL', TIMESTAMP '2024-01-01 09:31:00', 96.0),
    ('AAPL', TIMESTAMP '2024-01-01 09:32:00', 92.0),
    ('AAPL', TIMESTAMP '2024-01-01 09:33:00', 98.0),
    ('AAPL', TIMESTAMP '2024-01-01 09:34:00', 101.0),
    ('AAPL', TIMESTAMP '2024-01-01 09:35:00', 95.0),
    ('AAPL', TIMESTAMP '2024-01-01 09:36:00', 90.0),
    ('AAPL', TIMESTAMP '2024-01-01 09:37:00', 99.0),
    ('AAPL', TIMESTAMP '2024-01-01 09:38:00', 104.0)
  AS t(symbol, tstamp, price);

> SELECT symbol, start_tstamp, end_tstamp, w_no
  FROM stock_ticker
  MATCH_RECOGNIZE (
    PARTITION BY symbol
    ORDER BY tstamp
    MEASURES FIRST(tstamp)  AS start_tstamp,
             LAST(tstamp)   AS end_tstamp,
             MATCH_NUMBER() AS w_no
    ONE ROW PER MATCH
    AFTER MATCH SKIP PAST LAST ROW
    PATTERN ( strt down1+ up1+ down2+ up2+ )
    DEFINE down1 AS price < PREV(price),
           up1   AS price > PREV(price),
           down2 AS price < PREV(price),
           up2   AS price > PREV(price) ) AS T;
 symbol  start_tstamp           end_tstamp             w_no
 AAPL    2024-01-01 09:30:00    2024-01-01 09:38:00    1

Örnek 4: Oturum açma

Kullanıcının olay akışını, ardışık olaylar arasındaki 30 dakikadan uzun bir boşluğun yeni bir oturum başlattığı oturumlara daraltın. strt herhangi bir satırda oturum açar. same_session* öncekinden sonraki 30 dakika içinde gerçekleşen aşağıdaki her olayı emer. Bir boşluk eşiği aştığında eşleşme sona erer, AFTER MATCH SKIP PAST LAST ROW sonraki olayda devam eder ve yeni bir oturum (yeni MATCH_NUMBER()) başlar. Niceleyici, * yalnız bir olayı geçerli bir tek satırlı oturum yapar.

> CREATE OR REPLACE TEMP VIEW page_views AS
  SELECT * FROM VALUES
    (1, TIMESTAMP '2024-01-01 09:00:00'),
    (1, TIMESTAMP '2024-01-01 09:15:00'),
    (1, TIMESTAMP '2024-01-01 10:00:00'),
    (1, TIMESTAMP '2024-01-01 10:10:00')
  AS t(user_id, event_time);

> SELECT user_id, session_no, session_start, session_end, event_count
  FROM page_views
  MATCH_RECOGNIZE (
    PARTITION BY user_id
    ORDER BY event_time
    MEASURES MATCH_NUMBER()    AS session_no,
             FIRST(event_time) AS session_start,
             LAST(event_time)  AS session_end,
             COUNT(*)          AS event_count
    ONE ROW PER MATCH
    AFTER MATCH SKIP PAST LAST ROW
    PATTERN ( strt same_session* )
    DEFINE same_session AS event_time <= PREV(event_time) + INTERVAL 30 MINUTE ) AS T;
 user_id  session_no  session_start          session_end            event_count
 1        1           2024-01-01 09:00:00    2024-01-01 09:15:00    2
 1        2           2024-01-01 10:00:00    2024-01-01 10:10:00    2