SQL实现一行数据分组后转多行多列

这篇具有很好参考价值的文章主要介绍了SQL实现一行数据分组后转多行多列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在统计一些指标时,通常会有多个指标需要分组进行聚合,但是数据源的粒度可能并非是指标分组的粒度。举个例子,比如从访客表中提取访客的数据,每行数据有每个平台的首次访问时间;另外要做一个平台统计表,其中的一个指标统计的是各个平台近1天、7天、30天的新访客。这里的数据源的粒度是一行一个访客,带个平台时间字段,但指标粒度是一行一个平台两者不相同

先加上标签,一行多列变一行一列

        由于数据源需要统计的字段是多个,因此也没有办法根据字段进行group by 聚合,只能普通的先count(if(时间筛选条件)),一次性将所有的1天、7天以及30天的各个平台新增访客统计出来于一行,并加上标签区分平台(时间不用区分,因为30天人数>7天>1天),可以外层套层sql用concat(人数,'-',平台)再collect_set()聚合到一个数组中,,我这里用的是odpsSQL的map()函数.这时候数据变成了一行一列

再将数据从一行一列变成一行多列

        这时我们只需要通过lateral view explode() 进行展开成一列多行

拆解标签变成多行多列带分组标签字段

        再拆解出标签,通过split()将平台划分成单独的一个字段后,

将统计指标字段group by存入同一个标签分组中

        根据平台进行group by ,再将1天、7天、30天的数据collect_set()装入同一个数组中。

对数组中的数据进行处理得出字段

        将数组通过排序,通过数组下标直接获取对应时间的新增访客数。

总的代码如下:文章来源地址https://www.toymoban.com/news/detail-621315.html

select 
    platform,
    first_visit_count_list[0] as first_visit_count_1d,
    first_visit_count_list[1] as first_visit_count_7d ,
    first_visit_count_list[2] as first_visit_count_30d
from (
    select 
        platform,
        array_sort(collect_SET(first_visit_count),(l, r) -> CASE WHEN l < r THEN -1L WHEN l > r THEN 1L ELSE 0L END) as first_visit_count_list -- 30天>7天>1天,根据该规律排序数组即可
    from ( 
        select 
            map(    -- 存放在一个map里,便于展开
                -- 30天
                count(if(ssish_first_time>to_date(${bizdate-30},'yyyymmdd'),1,null)),'主站',
                count(if(mkf_first_time>to_date(${bizdate-30},'yyyymmdd'),1,null)),'my客蜂',
                count(if(cps_first_time>to_date(${bizdate-30},'yyyymmdd'),1,null)),'cps',
                count(if(wechatlink_first_time>to_date(${bizdate-30},'yyyymmdd'),1,null)),'微链',
                count(if(nyboss_first_time>to_date(${bizdate-30},'yyyymmdd'),1,null)),'保思',
                count(if(wxmall_first_time>to_date(${bizdate-30},'yyyymmdd'),1,null)),'微信商城',
            
                -- 7天
                count(if(ssish_first_time>to_date(${bizdate-7},'yyyymmdd'),1,null)),'主站',
                count(if(mkf_first_time>to_date(${bizdate-7},'yyyymmdd'),1,null)),'my客蜂',
                count(if(cps_first_time>to_date(${bizdate-7},'yyyymmdd'),1,null)),'cps',
                count(if(wechatlink_first_time>to_date(${bizdate-7},'yyyymmdd'),1,null)),'微链',
                count(if(nyboss_first_time>to_date(${bizdate-7},'yyyymmdd'),1,null)),'保思',
                count(if(wxmall_first_time>to_date(${bizdate-7},'yyyymmdd'),1,null)),'微信商城',

                -- 昨天
                count(if(ssish_first_time>to_date(${bizdate},'yyyymmdd'),1,null)),'主站',
                count(if(mkf_first_time>to_date(${bizdate},'yyyymmdd'),1,null)),'my客蜂',
                count(if(cps_first_time>to_date(${bizdate},'yyyymmdd'),1,null)),'cps',
                count(if(wechatlink_first_time>to_date(${bizdate},'yyyymmdd'),1,null)),'微链',
                count(if(nyboss_first_time>to_date(${bizdate},'yyyymmdd'),1,null)),'保思',
                count(if(wxmall_first_time>to_date(${bizdate},'yyyymmdd'),1,null)),'微信商城'
            )
            as platform_first_visit_count_list
        from nanyan_space.dim_visitors_info 
        where pt='${bizdate}'
    )a1
    lateral view explode(platform_first_visit_count_list) tmp as first_visit_count,platform
    group by platform
)a2

到了这里,关于SQL实现一行数据分组后转多行多列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 行转列--将多行数据转成多行多列的Table结构

    21年做的一个功能,涉及到将行数据转化成列数据。边查边做,一点一点的尝试着做好。当时感觉有点吃力。完成之后本想记录,但一直拖延至今。最近再次接手与这个功能相关的业务,整理了之前写的代码,趁此机会记录下来。 界面中是一个三级结构:L1级【Test Sample】,

    2024年02月05日
    浏览(43)
  • Hive SQL——explode拆分函数&多行(列)合并为一行(列)&reflect函数

    cd /data/import/ sudo vi test_explode_map_array.txt 添加以下文件内容 小明    产品1,产品2,产品3    性别:男,年龄:24 小花    产品4,产品5,产品6    性别:女,年龄:22  map_key map_value 年龄 24 性别 男 年龄 22 性别 女 prod_arr_new 产品1 产品2 产品3 产品4 产品5 产品6 name prod_arr_new 小明 产品1

    2024年02月15日
    浏览(41)
  • 【ORACLE】数据拼接那些事-多行或多列按指定分隔符拼接

    最近在做的某个项目中有一些数据预处理的工作,用的是Oracle数据库,涉及到表的拼接操作,在此记录一下并对数据库表的拼接知识做个扩充。 具体需求是: 把年龄(AGE)、性别(GENDER)、客户等级(CUSLEVEL)三个字段用逗号隔开拼接成一个字段 为空的字段不展示,三个字段全为空

    2023年04月16日
    浏览(26)
  • mysql中将多行数据合并成一行数据

    mysql中将多行数据合并成一行数据 一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据 例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句: SELECT am.activeId,m.modelName FROM activemodel am JOIN model m ON am.modelId = m.modelId ORDER BY am.activeId 查询出的列

    2024年02月16日
    浏览(25)
  • Hive多行转多列,多列转多行

    原始数据表 目标结果表 分析:目标表中的a和b是用分组形成,所以groupby字段选用原始表中col1,c、d、e是原始表中的行值,在目标表中成了列名,目标表中可以采用as做列名自定义,当原始表中的某一字段值等于某一特定值时,人为定义为结果表中的列名。 SQL实现 总结:多行

    2024年02月12日
    浏览(36)
  • 多行文本转成一行的实现方法

    哈喽大家好,我是咸鱼 不知道你们有没有遇到过下面的情况,以我为例 有时候我会收到批量操作服务器的需求,且我会拿到一个服务器 ip 列表,它是一个多行的形式,如下所示 但我使用 saltstack 进行批量操作时,我需要将上面的多行 ip 转成一行的形式才能执行 saltstack 命令

    2024年02月13日
    浏览(28)
  • 使用Notepad++将多行数据合并成一行

    1、按Ctrl+F,弹出“替换”的窗口; 2、选择“替换”菜单; 3、“查找目标”内容输入为:rn; 4、“替换为”内容为空; 5、“查找模式”选择为正则表达式; 6、设置好之后,点击“全部替换”,即可将多行数据合并成一行

    2024年01月23日
    浏览(29)
  • C语言——读写TXT文件中的(多行多列矩阵型)浮点型数据的两种方式

    文本行输入函数:fgets(读文本) 函数原型 参数 str – 这是指向一个字符数组的指针,该数组存储了要读取的字符串。 n – 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。 stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字

    2023年04月08日
    浏览(28)
  • mysql一行逗号分割的数据分解为多行

    在 MySQL 中,你可以使用函数 REPLACE 和 SUBSTRING_INDEX 来将一行逗号分隔的数据分解为多行。 例如,假设你有一个表,其中包含一列 items ,该列包含逗号分隔的字符串,如下所示: 你可以使用以下查询来将该表中的每一行数据分解为多行: 该查询会返回如下所示的结果: 你也

    2024年02月15日
    浏览(29)
  • Java8用Stream流一行代码实现数据分组统计,排序,最大值、最小值、平均值、总数、合计

    Java8对数据处理可谓十分流畅,既不改变数据,又能对数据进行很好的处理,今天给大家演示下,用Java8的Stream如何对数据进行分组统计,排序,求和等 汇总统计方法 找到汇总统计的方法。这些方法属于java 8的汇总统计类。 getAverage(): 它返回所有接受值的平均值。 getCount():

    2023年04月20日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包