dicemy/DataClawEval huggingface dataset:
# 全局分组 + 过滤统计 (FlinkSQL)

## Prompt
我需要你写一段 Flink SQL，用 datagen 内置连接器模拟交易流，按状态过滤后全局分组统计，结果打到 console。

**业务背景与目标**：用 datagen 内置表生成交易事件流，共 3000 行/秒。字段包括 trade_id（交易 ID）、type（交易类型，1~5）、status（状态，0~2）、amount（交易金额，0~5000）。

注意：`type` 和 `status` 是 SQL 保留字，需要使用反引号包裹（例如 `` `type` ``、`` `status` ``）。

先按 status = 1 过滤，再按 type 分组统计交易笔数和交易金额总和，最后输出到 console 表。因为不涉及窗口操作，无需定义事件时间和 Watermark。

**源表定义**：
- `trade_source`（datagen 连接器）：
  - trade_id BIGINT：交易 ID，随机取值
  - `` `type` `` INT：交易类型，随机取值 1~5
  - `` `status` `` INT：状态，随机取值 0~2
  - amount DOUBLE：交易金额，随机取值 0~5000
  - 生成速率：rows-per-second = 3000

**输出表定义**：
- `console_output`（print 连接器）：
  - `` `type` `` INT：交易类型
  - trade_cnt BIGINT：交易笔数
  - total_amount DOUBLE：交易金额总和

**过滤与聚合逻辑**：
- 过滤条件：`` `status` `` = 1（仅统计状态为 1 的交易）
- 分组：按 `` `type` `` 分组
- 聚合指标：COUNT(*) AS trade_cnt, SUM(amount) AS total_amount

**输出要求**：
- 使用 INSERT INTO console_output 将结果输出
- 输出字段顺序：`` `type` ``, trade_cnt, total_amount

## Reference Solution
-- flinksql_019: 全局分组 + 过滤统计
-- 生成 3000 行/秒的交易事件流，使用反引号包裹保留字

-- 1. 交易事件流 datagen 源表（无事件时间/Watermark）
CREATE TABLE trade_source (
    trade_id BIGINT,
    `type` INT,
    `status` INT,
    amount DOUBLE
) WITH (
    'connector' = 'datagen',
    'rows-per-second' = '3000',
    'fields.trade_id.kind' = 'random',
    'fields.trade_id.min' = '1',
    'fields.trade_id.max' = '1000000000',
    'fields.type.kind' = 'random',
    'fields.type.min' = '1',
    'fields.type.max' = '5',
    'fields.status.kind' = 'random',
    'fields.status.min' = '0',
    'fields.status.max' = '2',
    'fields.amount.kind' = 'random',
    'fields.amount.min' = '0',
    'fields.amount.max' = '5000'
);

-- 2. Console 输出表
CREATE TABLE console_output (
    `type` INT,
    trade_cnt BIGINT,
    total_amount DOUBLE
) WITH (
    'connector' = 'print'
);

-- 3. 过滤 status=1 + 按 type 分组统计
INSERT INTO console_output
SELECT
    `type`,
    COUNT(*) AS trade_cnt,
    SUM(amount) AS total_amount
FROM trade_source
WHERE `status` = 1
GROUP BY `type`;
# 窗口去重 (TVF Dedup) (FlinkSQL)

## Prompt
我需要你写一段 Flink SQL，用 datagen 内置连接器模拟事件流，使用 TUMBLE TVF 窗口表值函数 + ROW_NUMBER 做窗口去重，每个窗口内每个用户只保留最早的一条事件。

**业务背景与目标**：用 datagen 内置表生成用户事件流，共 5000 行/秒。字段包括 user_id（用户 ID，1~10000）、event_id（事件 ID）、event_type（事件类型，1~8）。使用 LOCALTIMESTAMP 作为事件时间，设置 10 秒 Watermark 延迟。

使用 TUMBLE 表值函数（TABLE(TUMBLE(...))）将事件分配到 5 分钟滚动窗口，然后在每个（window_start, user_id）分区内，按事件时间升序使用 ROW_NUMBER() 编号，只保留每个窗口每个用户的第一条事件（rn = 1），最后输出到 console。

**源表定义**：
- `event_source`（datagen 连接器）：
  - user_id INT：用户 ID，随机取值 1~10000
  - event_id BIGINT：事件 ID，随机取值
  - event_type INT：事件类型，随机取值 1~8
  - event_time：使用 LOCALTIMESTAMP 生成事件时间，设置 WATERMARK 延迟 10 秒
  - 生成速率：rows-per-second = 5000

**输出表定义**：
- `console_output`（print 连接器）：
  - window_start TIMESTAMP(3)：窗口起始时间
  - window_end TIMESTAMP(3)：窗口结束时间
  - user_id INT：用户 ID
  - event_id BIGINT：事件 ID
  - event_type INT：事件类型

**去重逻辑**：
- 窗口：TUMBLE TVF 5 分钟滚动窗口
- 排序：ROW_NUMBER() OVER (PARTITION BY window_start, user_id ORDER BY event_time ASC)
- 过滤：WHERE rn = 1 保留每个窗口每个用户的第一条事件
- 窗口时间字段可从 TVF 的 window_start 和 window_end 获得

**输出要求**：
- 使用 INSERT INTO console_output 将结果输出
- 输出字段顺序：window_start, window_end, user_id, event_id, event_type

## Reference Solution
-- flinksql_020: 窗口去重 (TVF Dedup)
-- TUMBLE TVF + ROW_NUMBER 按窗口去重，保留每个窗口每个用户的第一条

-- 1. 用户事件流 datagen 源表
CREATE TABLE event_source (
    user_id INT,
    event_id BIGINT,
    event_type INT,
    event_time AS LOCALTIMESTAMP,
    WATERMARK FOR event_time AS event_time - INTERVAL '10' SECOND
) WITH (
    'connector' = 'datagen',
    'rows-per-second' = '5000',
    'fields.user_id.kind' = 'random',
    'fields.user_id.min' = '1',
    'fields.user_id.max' = '10000',
    'fields.event_id.kind' = 'random',
    'fields.event_id.min' = '1',
    'fields.event_id.max' = '1000000000',
    'fields.event_type.kind' = 'random',
    'fields.event_type.min' = '1',
    'fields.event_type.max' = '8'
);

-- 2. Console 输出表
CREATE TABLE console_output (
    window_start TIMESTAMP(3),
    window_end TIMESTAMP(3),
    user_id INT,
    event_id BIGINT,
    event_type INT
) WITH (
    'connector' = 'print'
);

-- 3. TUMBLE TVF + ROW_NUMBER 窗口去重
INSERT INTO console_output
SELECT
    window_start,
    window_end,
    user_id,
    event_id,
    event_type
FROM (
    SELECT
        window_start,
        window_end,
        user_id,
        event_id,
        event_type,
        ROW_NUMBER() OVER (
            PARTITION BY window_start, user_id
            ORDER BY event_time ASC
        ) AS rn
    FROM TABLE(
        TUMBLE(TABLE event_source, DESCRIPTOR(event_time), INTERVAL '5' MINUTE)
    )
) t
WHERE rn = 1;