首页 > 数据库 >【clickhouse SQL语句03】

【clickhouse SQL语句03】

时间:2024-11-26 11:34:02浏览次数:5  
标签:03 name idx -- SQL SELECT dy 2017 clickhouse

1、with

#语法

with  表达式  as name
select  x from xxx

with语法有三种形式:

  • 定义变量
  • 调用函数
  • 查询

 形式1:定义变量  -->注意:这种是要给字段赋一个临时的值,所以select的时候必须查这个字段,如果查*输出的结果仍然是原数据的值

with 'hello' as sku_id
select sku_id,* from t_order_mt

 形式2:调用函数

with toYYYYMM(create_time) as dy 
select dy,* from t_order_mt limit 2;

-- 语句解析:用with调用函数toYYYYMM把create_time定义成年月

 实际工作中真实的sql

WITH 
    JSONExtract( data,  'event_raw_log', 'JSON') AS event_raw_log
    ,JSONExtract( event_raw_log,  'device_info', 'JSON') AS device_info
   ,JSONExtractString(device_info,'device_id') as device_id
SELECT device_id,* FROM target_event_attribution 
where device_id = 'b6d17958-06f5-4fc5-9097-d4b79a3dfb51' and appkey = '750bb7f034cd701b'
ORDER BY db_time desc 
limit 10 ;

形式3:执行查询  --->返回结果必须是一行,否则就报错

语法:with ()  as  xx

1)全局聚合  sum  count  avg

with (select count(1) from t_order_mt) as cnt 
select cnt,* from t_order_mt limit 2;

2、array join 函数获取每一行并将他们展开到多行(unfold)

  • 获取数组的角标
SELECT 
    id,
    name,
    bobby,
    arrayEnumerate(bobby) as idx --获取数组的角标
from 
    tb_arr_join

 针对上面的结果,我们想要输出bobby里面的每一个数及对应得到index

  • 升级语句
SELECT 
    id,
    name,
    bobby,
    arrayEnumerate(bobby) as idx, --获取数组的角标
    h,
    i
from 
    tb_arr_join
array join --拆分数组
    bobby as h,
    idx as i

 只想要数组的元素和它的角标

SELECT 
    id,
    name,
    h,
    idx
from 
    tb_arr_join
array join
    --拆分数组
    bobby as h,
    arrayEnumerate(bobby) as idx

 # 案例:

需求:

  1. 将同一个店铺中的时间收集到数组中,按照日期排序
  2. array join
  3. 日期 - 编号
  4. 分组 聚合

步骤:

1、创建一个shop.txt文件,放到clickhouse 的服务器下的/root/data路径下

a,2017-02-05,200
a,2017-02-06,300
a,2017-02-07,200
a,2017-02-08,200
b,2017-02-05,200
b,2017-02-06,300
b,2017-02-09,400
b,2017-02-08,200
c,2017-01-31,200
c,2017-02-01,300
c,2017-02-03,400
c,2017-02-10,600
a,2017-03-01,200
a,2017-03-02,300
a,2017-03-04,400
a,2017-03-05,600

2、创建shop表

CREATE table shop(
    name String,
    cdate Date,
    money Float64
)engine=MergeTree()
order by (name,cdate);

3、用clickhouse-client导入shop.txt文件数据

[root@localhost data]# clickhouse-client --host localhost --user default --port 9000 --password 123456 -q 'insert into shop FORMAT CSV' < '/root/data/shop.txt'

4、查看数据是否分组

select * from shop

截止到这里,我们需求的第一步的数据已经有了

1)将同一个店铺中的时间收集到数组中,按照日期排序

SELECT name,groupArray(cdate) as dates ,arrayEnumerate(dates) as idxs from shop group by name;

2)array join

SELECT name , dy,idx from (
        -- groupArray  合并成数组,arrayEnumerate 获取数组角标
        SELECT name,groupArray(cdate) as dates ,arrayEnumerate(dates) as idxs from shop group by name
)  
array join 
    dates as dy,
    idxs as idx
order by dy asc;

 3) 日期减编号

-- groupArray  合并成数组,arrayEnumerate 获取数组角标,subtractDays 求日期差值
SELECT name , dy,idx,subtractDays(dy,idx) sub    from (
        
        SELECT name,groupArray(cdate) as dates ,arrayEnumerate(dates) as idxs from shop group by name
)  
array join 
    dates as dy,
    idxs as idx
order by dy asc;

 4)分组 聚合

SELECT 
name,sub,COUNT(1) cnt
from 
(
    SELECT name , dy,idx,subtractDays(dy,idx) sub    from (
            SELECT name,groupArray(cdate) as dates ,arrayEnumerate(dates) as idxs from shop group by name
    )  
    array join 
        dates as dy,
        idxs as idx
    order by dy asc
)
group by (name,sub)
HAVING cnt >1
order by name,cnt DESC 
limit 1 by name; -- 只取一个name

 

标签:03,name,idx,--,SQL,SELECT,dy,2017,clickhouse
From: https://www.cnblogs.com/frankruby/p/18569811

相关文章

  • MySQL MVCC之Read View 的运行原理演示
    背景在MySQL的InnoDB存储引擎中,REPEATABLEREAD是默认的事务隔离级别。在这个隔离级别下,每个事务在开始时会创建一个ReadView,这个ReadView记录了事务开始时所有活跃事务的ID。事务在执行过程中会一直使用这个ReadView,即使其他事务提交了更改。示例假设我们......
  • WINDOWS环境下的MYSQL安装
    一、下载安装包1、进入官网,下载mysql社区版安装包https://dev.mysql.com/downloads/installer/MySQL::下载MySQL安装程序 二、安装1、安装包下载完成后,双击安装包,进入安装指引2、安装指引中,选择自定义安装Custom,并点击【下一步】 3、选择mysql服务 4、添加服务......
  • MySQL索引
      2.1索引概述2.1.1介绍索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。在无索引情况下,就需要从......
  • 【MySQL】备份与恢复
    文章目录一、前置准备二、备份三、恢复一、前置准备先创建库createdatabasetest;使用test数据库usetest;创建表createtabletest(idint,namevarchar(20));插入数据insertintotestvalues(1,"张三");insertintotestvalues(2,"李四");in......
  • GaussDB SQL基础语法示例-BOOLEAN表达式
    一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持的SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》为主线进行介绍。二、GaussDBSQL中的BOOLEAN表达式介绍1、概念在GaussDB数据库中,BOOLEAN表达式是一种很常见的表达......
  • GaussDB数据库SQL系列-LOCK TABLE
    一、前言GaussDB是一款高性能、高可用的分布式数据库,广泛应用于各类行业和场景。在GaussDB中,锁是实现并发控制的关键机制之一,用于协调多个事务之间的数据访问,确保数据的一致性和完整性。本文将围绕GaussDB数据库的LOCKTABLE做一简单介绍。二、GaussDB数据库的锁GaussDB提供了......
  • GaussDB数据库SQL系列-动态语句
    一、前言在数据库中构建动态SQL语句是指根据不同的条件或参数创建不同的SQL语句。这通常是为了适应不同的业务需求,提高SQL的灵活性和效率。GaussDB数据库是一款具备高性能、高可用性和高扩展性的关系型数据库,它提供了丰富的功能和工具,支持动态SQL语句的构建。下面我们将介绍如何......
  • GaussDB之SQL Audit,面向应用开发的SQL审核工具
    ​前言我们先从一个SQL语句说起(以某传统单机数据库为例)。也许这就是我们业务代码中潜藏的一个SQL语句,对于一个普通开发者来说,这个语句编写工整,逻辑清晰,没有什么问题,可以直接推到代码仓中交付上线。但是一个有经验的开发者或数据库管理员可能会发现这个SQL存在诸多的优化点:两张......
  • GaussDB数据库SQL系列-层次递归查询
    一、前言层次递归查询是一种常见的SQL查询方式,特别是在一些层次化的数据存储结构中经常用到。本文主要以GaussDB数据库为实验平台,为大家讲解其使用方法。二、GuassDB数据库层次递归查询概念层次化结构可以理解为树状数据结构,由节点构成。举个简单的例子,如下图所示,由子节点向上......
  • GaussDB数据库SQL系列-数据去重
    一、前言数据去重在数据库中是比较常见的操作。复杂的业务场景、多业务线的数据来源等等,都会带来重复数据的存储。本文以GaussDB数据库为实验平台,将为大家详细讲解如何去重。二、数据去重应用场景数据库管理(含备份):在数据库中进行数据去重可以避免数据重复存储、备份,提高数据库......