通过两个字段对GroupArray进行求和,并将第二个值相加

问题描述

我正在使用ClickHouse,我希望按field1(关键字)分组数据,并在其他字段中显示唯一网址,并为每个URL的点击总和值(其他字段)

原始数据

keyword |   URL                                     |  clicks   | impression|   position|   ctr
------------------------------------------------------------------------------------------------
kw1     |   https://mydomain.dev/url1.html          |   10      |   100     |       2   |   **0,10**
kw1     |   https://mydomain.dev/other-url2.html    |   20      |   434     |       3   |   0,05
kw1     |   https://mydomain.dev/url3.html          |   30      |   345     |       4   |   0,09
kw1     |   https://mydomain.dev/url1.html          |   10      |   40      |       5   |   0,25
kw1     |   https://mydomain.dev/other-url2.html    |   22      |   42      |       6   |   0,52
kw1     |   https://mydomain.dev/other-url2.html    |   23      |   43      |       7   |   0,53
Kw2     |   https://mydomain.dev/other-url-data-a   |   435     |   3243    |       1   |   **0,13**
Kw2     |   https://mydomain.dev/other-url-data-b   |   34      |   43      |       4   |   0,79
Kw2     |   https://mydomain.dev/other-url-data-c   |   23      |   433     |       7   |   0,05
Kw2     |   https://mydomain.dev/other-url-data-b   |   232     |   343     |       13  |   0,68
Kw2     |   https://mydomain.dev/other-url-data-a   |   23      |   232     |       14  |   0,10
Kw2     |   https://mydomain.dev/other-url-data-d   |   3       |   34      |       15  |   0,09
Kw2     |   https://mydomain.dev/other-url-data-d   |   23      |   345     |       16  |   0,07
Kw2     |   https://mydomain.dev/other-url-data-c   |   2       |   43      |       17  |   0,05

和预期的结果:

  • 从每千瓦(加粗)的最佳位置获取点击率
  • 并按url分组uniq url和总点击次数和展示次数

res

KW,|   URL  clicks : impressions               Cli:Impr|   otalclicks  | TotalUmp  |average    |   ctr     |best_position_by_kw
--------------------------------------------------------------------------------------------------------------------------------
kw1 |   https://mydomain.dev/url1.html          20:140  |       115     |   1004    |3,62       |   10,00%  |   2
    |   https://mydomain.dev/other-url2.html    65:519,|               |           |           |           |          
    |   https://mydomain.dev/url3.html          30:345  |               |           |           |           |
-------------------------------------------------------------------------------------------------------------------------------
kw2 |   https //mydomain.dev/other-url-data-a   667:3475|       775     |   4716    |4,43       |   13,41%  |   1           
        https //mydomain.dev/other-url-data-b   266 386 |               |           |
        https //mydomain.dev/other-url-data-c   25 379  |               |           |
        https //mydomain.dev/other-url-data-d   26 476  |               |           |

表格和数据:

主体表

CREATE TABLE users_data
(
    `fecha` Date,`consulta` String,`landing` String,`clicks` UInt32,`impresiones` UInt32,`posicion` Float32,`ctr` Float32,`dispositivo` String,`pais` String
)
ENGINE = MergeTree(fecha,landing,8192)
文件中的

获取“ Grupo”字段,我只需要将此表分组(用于对类似的kws分组)

SELECT
    consulta,any(Grupo) AS Grupo
FROM
    file('kw-2020.csv','CSVWithNames','fecha Date,consulta String,landing String,clicks UInt32,impresiones UInt32,posicion Float32,ctr Float32,dispositivo String,pais String,Grupo String')
GROUP BY
    consulta

用户数据的数据:

INSERT INTO  table_name  (fecha,consulta,clicks,impresiones,posicion,ctr,dispositivo,pais) VALUES ('2020-06-22','electricidad presupuestos electricos ejemplos','https://mydomain.dev/directory/ld-domain-de-presupuesto-de-elctricidad.PHP',1,7.0,0.0,'MOBILE','chl');
INSERT INTO  table_name  (fecha,'modelo de carta de recomendacion laboral peru','https://mydomain.dev/directory/ld-domain-de-carta-de-662.PHP',5.0,'DESKTOP','per');
INSERT INTO  table_name  (fecha,'carta de ofrecimiento de servicios a una empresa','https://mydomain.dev/directory/ld-domain-carta-para-ofrecer-servicios.PHP',3,1.0,'slv');
INSERT INTO  table_name  (fecha,'ejemplo de estrofa','https://mydomain.dev/directory/ld-ejemplo-de-estrofa.PHP',28.0,'nld');
INSERT INTO  table_name  (fecha,'carta de intención de servicios profesionales','https://mydomain.dev/directory/goto-domain-de-carta-de-384.PHP','mex');
INSERT INTO  table_name  (fecha,'ejemplos de presupuesto base cero','https://mydomain.dev/directory/ld-domain-de-presupuesto-base-cero.PHP',92.0,'como se hace una carta de recomendacion',77.0,'twn');
INSERT INTO  table_name  (fecha,'carta de oferta de productos a clientes','esp');
INSERT INTO  table_name  (fecha,'investigación hemerográfica','https://mydomain.dev/directory/ld-ejemplo-de-ficha-hemerogrfica.PHP',44.0,'rus');
INSERT INTO  table_name  (fecha,2,6,2.0,'col');

文件中的数据

   "grupo"    |  "consulta"
-----------------------------------------------------------
pedido    |  carta de pedido ejemplo
carta     |  carta de ofrecimiento de servicios a una empresa
carta     |  carta de intención de servicios profesionales
pedido    |  carta de pedido
carta     |  carta de oferta de productos a clientes
carta     |  carta de intención de servicios profesionales
pedido    |  carta de pedido ejemplo
carta     |  carta de presentacion a una empresa ofreciendo servicios
otros     |  rescisión de contrato modelo
pedido    |  carta de pedidos ejemplos
carta     |  carta de presentacion de empresas de servicios
carta     |  carta solicitando beca universitaria
pedido    |  carta comercial de pedido
carta     |  carta a clientes para ofrecer servicios
otros     |  casilla 99 modelo 390
pedido    |  carta de pedido
carta     |  carta de oferta de servicios
carta     |  carta de intencion de renta
pedido    |  carta de pedido
carta     |  carta de ofrecimiento de productos
otros     |  contrato de leasing modelo
pedido    |  carta de pedidos
carta     |  carta de presentacion de empresa de servicios
otros     |  rescisión de contrato modelo
pedido    |  carta de pedidos
carta     |  carta de presentacion de empresa para ofrecer productos
carta     |  modelo de carta de intencion academica
pedido    |  carta de solicitud de pedido
carta     |  carta de presentacion de servicios
otros     |  modelo de solicitud para beca de estudios
pedido    |  carta de solicitud de pedido
carta     |  carta de presentacion de servicios
otros     |  anexo ampliacion contrato de arras
carta     |  carta de solicitud de un producto
carta     |  carta para ofrecer servicios
otros     |  modelo de rescisión de contrato
pedido    |  carta comercial pedido
carta     |  carta a clientes para ofrecer servicios
otros     |  formato de rescisión de contrato de compraventa de inmueble
pedido    |  carta de anulacion de pedido
carta     |  carta a clientes para ofrecer servicios
otros     |  contrato de trabajo para extranjeros en chile
pedido    |  carta de pedido
carta     |  carta de ofrecer servicios
otros     |  modelo de recision de contrato
pedido    |  carta de pedido
carta     |  carta de oferta de servicios
otros     |  formato de rescisión de contrato de prestacion de servicios
pedido    |  carta de pedido
carta"    |  carta de ofrecimiento de servicios

我需要: 我需要的每个“ grupo”(包含许多kws)

每个组以及每个顾问组的所有不同的“ consulta”字段 值“ posicion”字段最低的“ CTR”值 -上次约会的“条件”

  • 每个“咨询”的点击次数和印象数
  • 组中每个咨询公司的印象和点击累积百分比

-所有不同的“着陆”以及“点击”和“印象”之和 -每个网址的展示和点击累计%

我尝试过这句话:

    SELECT 
    grupo,groupUniqArray(consulta) as KWS,groupUniqArray(landing) as landings,topK(1)(mediaPonderada)[1] AS PosicionFrecuente,anyLast(mediaPonderada) AS UltimaPosicion,varSamp(imp) AS varianza2,sqrt(varianza2) AS desviacion2,stddevSamp(imp) AS stdImp2,count() AS cnt,groupArray((consulta,imp,clicks2,round((clicks2 * 100) / imp,3),mediaPonderada)) AS consulta_imp,arraySum(x -> (x.2),consulta_imp) AS total_imp,total_imp / cnt AS media,arraySum(x -> (x.3),consulta_imp) AS total_clicks,round((total_clicks * 100) / total_imp,2) AS ctr,arrayMap(x -> ((100 / total_imp) * (x.2)),consulta_imp) AS percent_imp,arrayCumSum(percent_imp) AS acc_percent_imp,consulta_imp[1] AS total_ctr2,total_ctr2.4 AS ctr2
FROM 
(
    SELECT 
        grupo,quantileDeterministic(0.5)(impresiones,10) AS detImp,avg(impresiones) AS medImp,varSamp(impresiones) AS varMuestraimp,varPop(impresiones) AS varPobImp,sum(clicks) AS clicks2,sum(impresiones) AS imp,round((posicion * impresiones) / impresiones,0) AS mediaPonderada,arrayMap(2)(x -> round(x,2),max([round(posicion,0),impresiones])) AS arrclicks,varSamp(impresiones) AS varianza,avg(impresiones) AS media,stddevSamp(impresiones) AS stdImp,stddevPop(impresiones) AS stdPopImp,sqrt(varianza) AS desviacion,stdImp / media AS desvMedia
    FROM (
         SELECT 
            fecha,pais,Grupo as grupo
        FROM 
        (
            SELECT *
            FROM GSC_https_Modelode_com2 ghmc 
            WHERE fecha > '2020-01-01'
        ) AS t1
        LEFT JOIN 
        (
            SELECT 
                consulta,any(Grupo) AS Grupo
            FROM file('kw-2020.csv',`Raiz semantica` String,Volumen UInt32,clickstream UInt32,cpc Float32,Grupo String')
            GROUP BY consulta
        ) AS t2 USING (consulta)
        ORDER BY fecha ASC
    )
    WHERE (fecha > '2020-06-01')
    GROUP BY 
        grupo,mediaPonderada,consulta
    ORDER BY 
        mediaPonderada ASC,imp DESC
)
GROUP BY grupo

不起作用,URL重复且不计算点击次数和印象数

kw      |miArr                                                                                                                                                                                                                                                          
--------|---------------------------------------------------------------------------------------------------------------------------------
kw1     |['[https://mydomain.dev/url1.html,2]','[https://mydomain.dev/url1.html,1]','[https://mydomain.dev/url1.html#alternativas,0]','
kw2     |['[https://mydomain.dev/url2.html,'[https://mydomain.dev/url2.html,0]']                                                                                                  

解决方法

select keyword,groupArray((URL,cl,imp)),sum(cl),sum(imp) 
from (
from keyword,URL,sum(clicks) cl,sum(impression) imp
group by keyword,URL)
group by keyword