簡體   English   中英

(SQL - Snowflake)如何將一系列事件查詢到只提取第一個和最后一個事件的位置?

[英](SQL - Snowflake) How do I query a series of events to where it only pulls the first and last event?

我正在尋找查詢事件歷史記錄(包含大量任務和子任務的項目)到它只提取給定任務歷史記錄中的第一個和最后一個事件的位置,而中間沒有任何事件。

現在,我找不到另一種方法來比較基於原始事件的 ID(原始任務:子任務對)和當前的 ID(有時它們會根據任務在隊列之間移動時發生的情況而改變)。

這是我正在處理的主要查詢塊。

我對當前的“completed_at”字符串有信任問題,所以我想更改為使用 work_time(基本上是深度審計日志),但我只想要 MIN 和 MAX 時間。

如果它不是一個實際的專欄,我可以做這件事嗎?

select
    pt._id as t_id,
    ps._id as st_id,
    pt.completed_at as t_completed_at,
    pt.first_completed_at as t_first_completed_at,
    ps.completed_at as ps_completed_at,
    pt.times_redone,
    ps.is_recalled_subtask as ps_recalled,
    ps.status,
    ps.review_level,
    pt.customer_review_status,
    pt.customer_review_comments,
    array_size(ps.response:annotations),
    ps.subtask_version,
    vfwa.FIX_ATTEMPT,
    vfwa.work_time as time_attempt_was_completed

在訪問它們以允許 window 處理(如 SUM、MAX 等)之后,您可以使用QUALIFY刪除不需要的行

SELECT 
    t.order_val, 
    t.thing_a, 
    t.thing_b
FROM VALUES
    (1,'this is first', 'extra details'),
    (2,'this is second', 'hate to middle things'),
    (3,'this is third', 'hate to middle things'),
    (4,'this is firth', 'last this are as good as first')
    t(order_val, thing_a, thing_b)
QUALIFY order_val = max(order_val)over() OR order_val = min(order_val)over();

給出:

ORDER_VAL 事情A 事物_B
1個 這是第一 額外的細節
4個 這是弗斯 最后這個和第一個一樣好

經典的 QUALIFY 模式使用 ROW_NUMBER,看起來像:

QUALIFY row_number()over(order by order_val) = 1 OR row_number()over(order by order_val DESC) = 1

但是,如果您已經計算出您的值,則可以像在完成所有 GROUPING 后運行的獎勵 WHERE 子句一樣使用它。

MATCH_RECOGNIZE是為此創建的:

select * from stock_price_history
  match_recognize(
    partition by company
    order by price_date
    measures
      first(price_date) as start_date,
      last(price_date) as end_date,
      first(price) as start_price,
      last(price) as end_price
    one row per match
    pattern(x*)
    define
        t as true
  )
order by company;

基本上,使用partition ,您可以按任務划分, first()last()將帶來標識一系列事件的第一行和最后一行所需的 ID 或值。

在此處輸入圖像描述

設置:

create table stock_price_history (company text, price_date date, price int);
insert into stock_price_history values
    ('ABCD', '2020-10-01', 50),
    ('XYZ' , '2020-10-01', 89),
    ('ABCD', '2020-10-02', 36),
    ('XYZ' , '2020-10-02', 24),
    ('ABCD', '2020-10-03', 39),
    ('XYZ' , '2020-10-03', 37),
    ('ABCD', '2020-10-04', 42),
    ('XYZ' , '2020-10-04', 63),
    ('ABCD', '2020-10-05', 30),
    ('XYZ' , '2020-10-05', 65),
    ('ABCD', '2020-10-06', 47),
    ('XYZ' , '2020-10-06', 56),
    ('ABCD', '2020-10-07', 71),
    ('XYZ' , '2020-10-07', 50),
    ('ABCD', '2020-10-08', 80),
    ('XYZ' , '2020-10-08', 54),
    ('ABCD', '2020-10-09', 75),
    ('XYZ' , '2020-10-09', 30),
    ('ABCD', '2020-10-10', 63),
    ('XYZ' , '2020-10-10', 32);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM