Почему я не могу создать столбцы агрегированной средней разницы дат в SQL - PullRequest
0 голосов
/ 22 июня 2019

Я хочу создать столбцы средней разницы дат в SQL для набора тестовых данных AB, с которым я работаю, но все, с чем я работаю, заканчивается сообщением об ошибке.

original data

Я пытался объединить таблицы, но это не сработало, я все еще довольно новичок в SQL, поэтому я в замешательстве!

SELECT
ab_group,
avg(datediff(install_date, conversion_date) as avg_install_2_purchase,
avg(datediff(assignment_date, conversion_date) as avg_assignment_to_purchase,
avg(count(purchases)/count(assignment_date)
from
table
group by ab_group

output Я надеялся, что результат будет похож на мое изображение, в предоставленных данных большинство преобразований равно нулю, но они есть в моих данных.Я не уверен, почему код не работает?

Ответы [ 3 ]

2 голосов
/ 23 июня 2019

Почему мы не используем подзапросы, чтобы все было проще читать / понимать / отлаживать?Я имею в виду, да, это немного многословно, не всегда лучший выбор в производстве, но это почти всегда помогает сделать вещи явными, хорошо обрисованными и очень удобочитаемыми:

select 
 ab_group,
 avg_install_to_purchase,
 avg_assignment_to_purchase,
 if(coalesce(assignment_dates, 0) = 0, 0.0, purchases/assignment_dates) as ratio from 
(
   select 
       ab_group, 
       avg(install_to_purchase) as avg_install_to_purchase, 
       avg(assignment_to_purchase) as avg_assignment_to_purchase, 
       count(purchases) as purchases, 
       count(assignment_date) as assignment_dates
   from (
            select 
               ab_group,
               coalesce(abs(datediff(install_date, conversion_date, day)), 0) as install_to_purchase,
               coalesce(abs(datediff(assignment_date, conversion_date, day)), 0) as assignment_to_purchase,
               coalesce(purchases, 0) as purchases,
               assignment_date
            from `mydataset.mytable`
        )
    )
)
1 голос
/ 22 июня 2019

Ниже приведено описание BigQuery Standard SQL

Слишком много проблем с вашим запросом, поэтому прежде чем я попытаюсь его зарегистрировать - просмотрите исправленную версию его

#standardSQL
SELECT
  ab_group,
  AVG(DATE_DIFF(PARSE_DATE('%d/%m/%Y',install_date), PARSE_DATE('%d/%m/%Y',conversion_date), DAY)) AS avg_install_2_purchase,
  AVG(DATE_DIFF(PARSE_DATE('%d/%m/%Y',assignment_date), PARSE_DATE('%d/%m/%Y',conversion_date), DAY)) AS avg_assignment_to_purchase,
  COUNT(purchases)/COUNT(assignment_date)
FROM `project.dataset.table`
GROUP BY ab_group

Сравнение оригиналаи выше запрос - вы, скорее всего, можете найти все проблемы - ниже их несколько

  • Нет функции datediff () - скорее DATE_DIFF ()
  • , которая принимает типы DATEне тип STRING, поэтому вам нужно преобразовать строковые даты в даты типа DATE, используя функцию PARSE_DATE ()
  • DATE_DIFF также требует DATE_PART в качестве последнего аргумента, который был пропущен - я предполагаю, что это DAY
  • Было несколько пропущенных скобок
  • и, наконец, вы попытались выполнить агрегирование по агрегации (AVG (COUNT () / COUNT ())
0 голосов
/ 22 июня 2019

Я думаю, что ошибка в этой строке:

avg(count(purchases)/count(assignment_date)

Во-первых, вам не хватает закрывающих скобок. Во-вторых, вы не можете вкладывать функции агрегирования.

Я думаю, вы просто намереваетесь:

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