ClickHouse 的 ORDER BY WITH FILL


ORDER BY Expr WITH FILL Modifier

可以在ORDER BY expr之后用可選的FROM expr,TO expr和STEP expr參數來設置WITH FILL修飾符。
所有expr列的缺失值將被順序填充,而其他列將被填充為默認值。

使用以下語法填充多列,在ORDER BY部分的每個字段名稱后添加帶有可選參數的WITH FILL修飾符。

ORDER BY expr [WITH FILL] [FROM const_expr] [TO const_expr] [STEP const_numeric_expr], ... exprN [WITH FILL] [FROM expr] [TO expr] [STEP numeric_expr]

WITH FILL 僅適用於具有數字(所有類型的浮點,小數,整數)或日期/日期時間類型的字段。
當未定義 FROM const_expr 填充順序時,則使用 ORDER BY 中的最小 expr 字段值。
如果未定義 TO const_expr 填充順序,則使用 ORDER BY 中的最大expr字段值。
當定義了 STEP const_numeric_expr 時,對於數字類型,const_numeric_expr 將 as is 解釋為 days 作為日期類型,將 seconds 解釋為DateTime類型。
如果省略了 STEP const_numeric_expr,則填充順序使用 1.0 表示數字類型,1 day表示日期類型,1 second 表示日期時間類型。

示例:

-- 表結構和數據准備
CREATE TABLE IF NOT EXISTS fillwith
(
    `event_timestamp` Datetime64,
    `event_date` Date,
    `event_type` String
)
ENGINE = Memory;
insert into fillwith (event_timestamp, event_date, event_type) values ('2021-01-07 19:14:33.000', '2021-01-07', 'PRODUCT_VIEW');
insert into fillwith (event_timestamp, event_date, event_type) values ('2021-02-07 19:14:33.000', '2021-02-07', 'PRODUCT_CLICK');
insert into fillwith (event_timestamp, event_date, event_type) values ('2020-11-07 19:14:33.000', '2020-11-07', 'PRODUCT_VIEW');
insert into fillwith (event_timestamp, event_date, event_type) values ('2020-12-07 19:14:33.000', '2020-12-07', 'PRODUCT_VIEW');
insert into fillwith (event_timestamp, event_date, event_type) values ('2020-09-07 19:14:33.000', '2020-09-07', 'PRODUCT_VIEW');

-- 常規group by 查詢
SELECT 
    toDate(toStartOfInterval(event_date, toIntervalDay(1))) AS date,
    countIf(event_type = 'PRODUCT_VIEW') AS views,
    countIf(event_type = 'PRODUCT_CLICK') AS clicks
FROM fillwith
GROUP BY toDate(toStartOfInterval(event_date, toIntervalDay(1)))
ORDER BY date ASC;

查詢結果

使用order by expr with fill modifier

SELECT
    toStartOfMonth(date) AS month,
    sum(views) AS views,
    sum(clicks) AS clicks
FROM 
(
    SELECT
        event_date AS date,
        countIf(event_type = 'PRODUCT_VIEW') AS views,
        countIf(event_type = 'PRODUCT_CLICK') AS clicks
    FROM fillwith
    GROUP BY date
    ORDER BY date ASC 
        WITH FILL 
            FROM toDate('2020-01-01') 
            TO toDate('2021-12-01') 
            STEP 1
)
GROUP BY month
ORDER BY month ASC
-- 或者 另一個 sql
WITH toDate(0) AS start_date, toRelativeMonthNum(toDate(0)) AS relative_month_of_start_date
SELECT
    addMonths(start_date, relative_month - relative_month_of_start_date) AS month,
    views,
    clicks
FROM 
(
    SELECT
        toRelativeMonthNum(event_date) AS relative_month,
        countIf(event_type = 'PRODUCT_VIEW') AS views,
        countIf(event_type = 'PRODUCT_CLICK') AS clicks
    FROM fillwith
    GROUP BY relative_month
    ORDER BY relative_month ASC 
        WITH FILL 
            FROM toRelativeMonthNum(toDate('2020-01-01'))
            TO toRelativeMonthNum(toDate('2021-12-01')) STEP 1
)
ORDER BY month ASC

查詢結果

需要注意的是:查詢必須至少有一條結果
1、空表的最終查詢統計結果是空,不會進行排序填充
2、以上面數據為例,如果加入where條件,篩選2021年10月以后的數據統計(event_date >= toDate('2021-10-01')),那么無法填充,因為2021年10月之后的數據為空。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM