当前位置: 首页 > article >正文

flinksql-Queries查询相关实战

  1. 分组聚合

--分组集

--GROUPING SETS() 允许你定义特定的分组方式,这样你可以选择只对感兴趣的分组进行计算。

--通过手动指定不同的分组组合,你能够灵活地控制数据的聚合结果。

--与 ROLLUP 和 CUBE 不同,GROUPING SETS 不会自动生成所有子集组合,而是只生成你指定的那些。

SELECT supplier_id, rating, COUNT(*) AS total

FROM (VALUES

    ('supplier1', 'product1', 4),

    ('supplier1', 'product2', 3),

    ('supplier2', 'product3', 3),

    ('supplier2', 'product4', 4))

AS Products(supplier_id, product_id, rating)

GROUP BY GROUPING SETS ((supplier_id, rating), (supplier_id), ());

--ROLLUP

--ROLLUP() 用于执行分层级别的聚合,主要用于需要按顺序逐层汇总数据的场景。

--与 CUBE() 不同,ROLLUP() 只生成按从左到右逐步减少维度的组合,而不是所有可能的子集组合。

--例如,ROLLUP(a, b, c) 会生成 (a, b, c), (a, b), (a), 和 (),而不会像 CUBE() 那样生成所有的可能组--合。

SELECT supplier_id, rating, COUNT(*)

FROM (VALUES

    ('supplier1', 'product1', 4),

    ('supplier1', 'product2', 3),

    ('supplier2', 'product3', 3),

    ('supplier2', 'product4', 4))

AS Products(supplier_id, product_id, rating)

GROUP BY ROLLUP (supplier_id, rating);

--立方体

--CUBE() 是一种扩展的 GROUP BY 操作,允许你针对多列进行分组聚合,并生成每种可能的维度组合的聚合结果。

--如果使用了 CUBE(a, b, c),Flink 会计算出所有 a, b, c 及其子集的组合的聚合结果。

--在数据分析和 OLAP(在线分析处理)场景中,CUBE 常用来计算多维数据的统计值。

SELECT supplier_id, rating, COUNT(*)

FROM (VALUES

    ('supplier1', 'product1', 4),

    ('supplier1', 'product2', 3),

    ('supplier2', 'product3', 3),

    ('supplier2', 'product4', 4))

AS Products(supplier_id, product_id, rating)

GROUP BY CUBE (supplier_id, rating);

  1. 窗口函数TVF

--注:不支持cdc模式,因为窗口函数只支持追加模式的,不支持update与delete操作

--模拟表

CREATE TABLE bid (

    `id` string,

    bidtime TIMESTAMP(3),

    price DECIMAL(10, 2),

    item string,

    ts as bidtime,

    WATERMARK FOR ts AS ts - INTERVAL '5' SECOND,

    --proc_time AS PROCTIME(),  

    PRIMARY KEY (`id`) NOT ENFORCED

  )

WITH

  (

    'connector' = 'jdbc',

    ${36},

    'table-name' = 'bid'

  );

  --滚动窗口

  --  SELECT cast(window_start as string) AS window_start, cast(window_end as string) AS window_end , SUM(price) AS total_price

  --  FROM TABLE(

  --  TUMBLE(TABLE  bid, DESCRIPTOR(ts), INTERVAL '10' MINUTES))

  --  GROUP BY window_start, window_end;

--滑动窗口

--  SELECT cast(window_start as string) AS window_start, cast(window_end as string) AS window_end , SUM(price) AS total_price

--    FROM TABLE(

--      HOP(TABLE bid, DESCRIPTOR(ts), INTERVAL '5' MINUTES, INTERVAL '10' MINUTES))

--    GROUP BY window_start, window_end;

--累计窗口

--  SELECT  cast(window_start as string) AS window_start, cast(window_end as string) AS window_end , SUM(price) AS total_price

--    FROM TABLE(

--      CUMULATE(TABLE bid, DESCRIPTOR(ts), INTERVAL '5' MINUTES, INTERVAL '20' MINUTES))

--    GROUP BY window_start, window_end;

 --会话窗口(不支持批处理)

 SELECT window_start, window_end, item, SUM(price) AS total_price

  FROM TABLE(

      SESSION(TABLE bid PARTITION BY item, DESCRIPTOR(ts), INTERVAL '5' MINUTES))

  GROUP BY item, window_start, window_end;

  1. 窗口聚合

     

CREATE TABLE bid (

    `id` string,

    bidtime TIMESTAMP(3),

    price DECIMAL(10, 2),

    item string,

    supplier_id string,

    ts as bidtime,

    WATERMARK FOR ts AS ts - INTERVAL '5' SECOND,

    --proc_time AS PROCTIME(),  

    PRIMARY KEY (`id`) NOT ENFORCED

  )

WITH

  (

    'connector' = 'jdbc',

    ${36},

    'table-name' = 'bid'

  );

--分组集

--  SELECT  cast(window_start as string) AS window_start, cast(window_end as string) AS window_end , supplier_id, SUM(price) AS total_price

--    FROM TABLE(

--      TUMBLE(TABLE bid, DESCRIPTOR(ts), INTERVAL '10' MINUTES))

--    GROUP BY window_start, window_end, GROUPING SETS ((supplier_id), ());

--ROLLUP

--  SELECT cast(window_start as string) AS window_start, cast(window_end as string) AS window_end , supplier_id, SUM(price) AS total_price

--  FROM TABLE(

--      TUMBLE(TABLE bid, DESCRIPTOR(ts), INTERVAL '10' MINUTES))

--  GROUP BY window_start, window_end, ROLLUP (supplier_id);

--立方体

SELECT cast(window_start as string) AS window_start, cast(window_end as string) AS window_end , supplier_id, item, SUM(price) AS total_price

  FROM TABLE(

    TUMBLE(TABLE bid, DESCRIPTOR(ts), INTERVAL '10' MINUTES))

GROUP BY window_start, window_end, CUBE (supplier_id, item);

  1. Over聚合

     持续更新 


http://www.kler.cn/a/371662.html

相关文章:

  • 我与算法的不期而遇:一场精心策划的技术邂逅
  • gin入门教程(7): 使用 Logrus + Lumberjack 创建日志中间件
  • 《SMO算法 公式推导》9-78经剪辑后α2更新α1的值 公式解析
  • Java Lock LockSupport 总结
  • vue前端使用pdfjs与pdfdist-mergeofd 实现预览pdf并翻页,同时解决预览pdf显示模糊的问题
  • 山西农业大学20241029
  • 算法篇——动态规划最终篇 (js版)
  • uniapp position: fixed 兼容性不显示问题
  • Python Flask 数据库开发
  • Modbus TCP报文协议(ModbusTCP)
  • H5底部输入框点击弹起来的时候被软键盘遮挡bug
  • QT编译报错:-1: error: cannot find -lGL
  • 淘宝商品评价API的获取与应用
  • Prometheus自定义PostgreSQL监控指标
  • 直接删除Github上的文件
  • [flask] flask-mail邮件发送
  • 论区块链技术及应用
  • 网络安全领域推荐职位
  • Data+AI下的数据飞轮:如何重塑企业增长
  • SpringBoot 解析@Value注解型解析注入时机以及原理
  • GPT-4V 是什么?
  • springboot工作原理以及自动装配原理
  • 软考高级架构 - 7.3 - 软件架构风格 - 超详细讲解+精简总结
  • Stable Diffusion 3.5发布:图像生成新纪元,多模态AI的突破!
  • 宽带自动获取ip地址好不好:利与弊的深度剖析
  • 【云原生】云原生后端:监控与观察性