iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
AI/ ML & Data

粗暴的資料處理 DuckDB系列 第 18

Day18 -- DuckDB Style SQL (12) ?

  • 分享至 

  • xImage
  •  

昨天延續了 lambda 的應用,介紹的 columns function,一個如其名一般的強大 的 function。

今天來特別介紹 columns function 的其他用法:

除了使用 lambda 函數,columns function 還支持使用 regex 來選擇列。這對於處理具有特定命名模式的col 特別有用。

SELECT COLUMNS('.*_dude$')
FROM community;

這個查詢會選擇所有以 '_dude' 結尾的列。

特定列的 aggregation:

SELECT max(COLUMNS('.*_dude$'))
FROM community;

所有以 '_dude' 結尾的列的最大值

我完全不知道在 Postgres 要怎麼辦到類似的事情,問了一下 chatGPT,原來要寫 Postgres 的 PL/pgSQL
生出模板 query 在執行,還算可以理解,但我覺得維護成本比起 columns function 高了一些。

DO $$
DECLARE
    query text := 'SELECT ';
    column_list text := '';
BEGIN
    SELECT string_agg(column_name, ', ')
    INTO column_list
    FROM information_schema.columns
    WHERE table_name = 'community'
      AND column_name LIKE '%_dude';

    IF column_list = '' THEN
        RAISE NOTICE 'No columns ending with _dude found';
        RETURN;
    END IF;

    query := query || column_list || ' FROM community';
    EXECUTE query;
END $$;

選擇所有以 '_dude' 結尾的列。

DO $$
DECLARE
    query text := 'SELECT ';
    column_list text := '';
BEGIN
    SELECT string_agg('MAX(' || column_name || ') AS max_' || column_name, ', ')
    INTO column_list
    FROM information_schema.columns
    WHERE table_name = 'community'
      AND column_name LIKE '%_dude';

    IF column_list = '' THEN
        RAISE NOTICE 'No columns ending with _dude found';
        RETURN;
    END IF;

    query := query || column_list || ' FROM community';
    EXECUTE query;
END $$;

所有以 '_dude' 結尾的列的最大值,字串拼貼成 query 在執行,我覺得讀起來複雜很多。

今天介紹了用 regex 選出很多 col,然後對這些 col 做同一種 aggregation,但 columns 還有其他進階的應用,我們明天繼續探討。


上一篇
Day17 -- DuckDB Style SQL (11) ?
下一篇
Day19 -- DuckDB Style SQL (13) ?
系列文
粗暴的資料處理 DuckDB30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言