Как рассчитать частоту всплытия определенного значения - PullRequest
2 голосов
/ 20 сентября 2019

Я бы хотел посчитать, как часто конкретный сайт появляется чаще, чем один раз в течение года.

Таблица выглядит следующим образом: site_metrics

| site          | date | 
|       abc.com | 20190101 | 
|       abc2.com | 20190102   | 
|       abc2.com | 20190302   | 
|       abc2.com | 20190402   | 
|       abc2.com | 20190502   | 
|       abc3.com | 20190502   | 
|       abc3.com | 20190602   | 

Я хотел бы сказать, что x% сайтов обновляются более одного раза в год.

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Если я правильно понимаю, вы можете использовать два уровня агрегирования:

select avg(case when num_in_year > 1 then 1.0 else 0 end) as resurface_rate
from (select site, count(*) as num_in_year
      from t
      where date >= '2019-01-01' and date < '2020-01-01'
      group by site
     ) s;

Если вы хотите это за календарный год:

select yyyy,
       avg(case when num_in_year > 1 then 1.0 else 0 end) as resurface_rate
from (select site, extract(year from date) as yyyy, count(*) as num_in_year
      from t
      group by site, extract(year from date)
     ) s
group by yyyy;
0 голосов
/ 21 сентября 2019

Ниже для BigQuery Standard SQL и используйте только один GROUP BY для получения resurface_rate per year

Я не уверен, имеет ли это много практического значения (так как он использует относительно дорогие функции регулярного выраженияи с большим количеством сайтов могут иметь масштабную проблему), но как концептуальная версия интересна, я думаю

#standardSQL
CREATE TEMP FUNCTION extract_year(date ANY TYPE) AS (
  SUBSTR(date, 1, 4) -- if stored as YYYYMMDD as string
--  EXTRACT(YEAR FROM date) -- if stored as DATE type
); -- just to abstact year extraction from user's data as it is not that important but really depends on how exactly it is stored
SELECT extract_year(date) year, 
  1 - ARRAY_LENGTH(REGEXP_EXTRACT_ALL(REGEXP_REPLACE(
    CONCAT(STRING_AGG(site ORDER BY site), ','), 
    STRING_AGG(DISTINCT CONCAT('(',site,',){2,}'), '|'), 
    ''
  ), ',')) / COUNT(DISTINCT site) AS resurface_rate
FROM  `project.dataset.table`
GROUP BY year

Если применить к образцу данных из вашего вопроса - результат

Row year    resurface_rate   
1   2019    0.6666666666666667   

Скорее всего, можно еще «упростить» - но просто хотел поделиться этой неортодоксальной версией

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...