【问题标题】:GroupArray by two fields, and sum values of secondGroupArray 由两个字段和第二个的总和值
【发布时间】:2021-01-12 00:44:59
【问题描述】:

我正在使用 ClickHouse,我希望按 field1(关键字)对数据进行分组,并在其他字段中显示 uniq url 以及每个 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

以及想要的结果:

  • 从每个 kw 的最佳位置获取 ctr(粗体)
  • 对 uniq url 进行分组,并按 url 汇总点击次数和展示次数

分辨率

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)

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

每个组的所有不同的“咨询”字段,以及每个咨询:在组中 -“位置”字段最低的“点击率”值 - 最后日期的“位置”

  • 每个不同“顾问”的点击次数和展示次数
  • 组中每个咨询的展示次数和点击次数的累积百分比

-所有不同的“着陆”以及“点击次数”和“展示次数”的总和 - 每个网址的展示次数和点击次数的累计百分比

我试过这句话:

    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,
        consulta,
        landing,
        quantileDeterministic(0.5)(impresiones, 10) AS detImp,
        avg(impresiones) AS medImp,
        varSamp(impresiones) AS varMuestraImp,
        varPop(impresiones) AS varPobImp,
        count() AS cnt,
        sum(clicks) AS clicks2,
        sum(impresiones) AS imp,
        round((clicks2 * 100) / imp, 2) AS ctr,
        round((posicion * impresiones) / impresiones, 0) AS mediaPonderada,
        arrayMap(2)(x -> round(x, 2), max([round(posicion, 0), clicks, 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,
            consulta,
            landing,
            clicks,
            impresiones,
            posicion,
            ctr,
            dispositivo,
            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', 'CSVWithNames', 'fecha Date,  consulta String,  landing String,  clicks UInt32,  impresiones UInt32,  posicion Float32,  ctr Float32,  dispositivo String,  pais String,`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,
        landing,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, 1]','[https://mydomain.dev/url2.html, 0]']                                                                                                  

【问题讨论】:

  • 给我们创建表/插入测试数据,否则你的问题很难理解
  • 主体表 CREATE TABLE users_data (fecha Date, consulta String, landing String, clicks UInt32, impresiones UInt32, posicion Float32, ctr Float3 987654336@ String, pais String ) ENGINE = MergeTree(fecha, Landing, 8192)
  • 第二张表,(文件 csv)! FROM file('kw-2020.csv', 'CSVWithNames', 'fecha Date, Consulta String, Landing String, clicks UInt32, impresiones UInt32, posicion Float32, ctr Float32, dispositivo String, pais String,`,Volumen UInt32,clickstream UInt32 ,cpc Float32,Grupo String')
  • 我需要:对于每个“grupo”(包含许多 kws)我需要 - 每个组的所有不同“consulta”字段,以及每个咨询:在组中 -“CTR”的值其中“位置”字段最低 - 最后日期的“位置” - 每个不同“顾问”的点击次数和展示次数 - 组中每个顾问的展示次数和点击次数的累积百分比 - 所有不同的“着陆”和总“点击次数”和“展示次数” - 每个网址的展示次数和点击次数的累计百分比????
  • 如何与您共享 INSERTS 或数据?

标签: sql database clickhouse


【解决方案1】:
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

【讨论】:

  • 谢谢 Denny,但是如何选择第一个 CTR 值?
  • groupArray(1)(ctr)
  • 丹尼,首先对不起我的英语,我无法完全解释它。我需要位置最低的 CTR 值
  • 我不在乎。我不会说英语。我只会说 SQL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多