weixin_45946856 2022-08-02 00:20 采纳率: 0%
浏览 71
已结题

sql合并连续时间段内,某字段相同的行。

(HIVE/SPARK)建表语句如下:
create database if not exists test;
use test;
CREATE TABLE if not exists test.test (
dt string,
level string,
cnt int )
ROW format delimited FIELDS TERMINATED BY '\t';
INSERT INTO TABLE test.test VALUES
( '2022:08:01 01', 'high', 12 ),( '2022:08:01 02', 'low', 4 ),( '2022:08:01 03', 'low', 5 ),
( '2022:08:01 04', 'low', 1),( '2022:08:01 05', 'low', 2 ),( '2022:08:01 06', 'high', 14 ),
( '2022:08:01 07', 'high', 15),( '2022:08:01 08', 'high', 11 ),( '2022:08:01 09', 'low', 9 ),
( '2022:08:01 10', 'high', 10 ),( '2022:08:01 11', 'high', 11 ),( '2022:08:01 12', 'low', 8 );

表如下:
2022:08:01 01,high,12
2022:08:01 02,low,4
2022:08:01 03,low,5
2022:08:01 04,low,1
2022:08:01 05,low,2
2022:08:01 06,high,14
2022:08:01 07,high,15
2022:08:01 08,high,11
2022:08:01 09,low,9
2022:08:01 10,high,10
2022:08:01 11,high,11
2022:08:01 12,low,8

现需求如下:
2022:08:01 01,high,12
2022:08:01 02,low,12
2022:08:01 06,high,40
2022:08:01 09,low,9
2022:08:01 10,high,21
2022:08:01 12,low,8

大意为:
将level为high或low的连续时间段,合并为‘高峰期’和‘低谷期‘,并加和期间的流量。
如结果中的dt能为当前期间的‘开始-结尾’格式更佳。

  • 写回答

1条回答 默认 最新

  • 三千烦恼丝xzh 2022-08-02 10:34
    关注

    给个思路,先实现连续段切分,使用row_number求两个序号,一个全局分区dt排序,一个level分区dt排序,然后全局分区号减去level分区号得出的数一致的则为连续的段,之后用这个段做group的前缀key则可以实聚合求值,而且用Max和Min也可以拿到分区最大最小dt时间

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月7日
  • 修改了问题 8月2日
  • 创建了问题 8月2日

悬赏问题

  • ¥15 求学软件的前人们指明方向🥺
  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services