Intereting Posts
Rails: ActiveRecord db операция сортировки нечувствительна Предотвращение вставки перекрывающихся диапазонов дат с помощью триггера SQL Oracle JDBC: как узнать, какая строка вызывает уникальное ограничение ключа? XML-анализ: хорошо сформированная проверка: необъявленная сущность Как написать инструкцию MYSQL CASE WHEN с несколькими условиями поиска? SQLite Union из n таблиц с m столбцами Каскадное удаление в сущности SQL Merge 3 таблицы по дате, когда отсутствуют некоторые даты Как я могу распечатать запрос SQL, выполняемый после заполнения DBI Perl в заполнителях? запись из datatable в foxpro через oledb не выполняется после X записей Временная структура базы данных с твист (живые против строк строк) Хранимая процедура динамическая / общая, где 4 байта unsigned int в SQL Server? Отключить безопасный приват для загрузки данных в MySQL Ошибка MySQL в наибольшей степени на группу

Доход от реактивации SQL

Я ищу запрос, который будет получать сумму Reactivation Revenue с указанной даты. В настоящее время у меня есть следующий запрос;

SELECT advertisable, EXTRACT(YEAR from day), EXTRACT(MONTH from day), ROUND(SUM(cost)/1e6) FROM adcube dac WHERE advertisable_eid IN (SELECT advertisable FROM adcube dac GROUP BY advertisable HAVING SUM(cost)/1e6 > 100) GROUP BY advertisable, EXTRACT(YEAR from day), EXTRACT(MONTH from day) ORDER BY advertisable, EXTRACT(YEAR from day), EXTRACT(MONTH from day) 

Из этого я затем экспортирую в Excel и проверять счета, которые перестали тратить на 4 месяца, а затем снова активировались. Затем я отслеживаю новый доход от нового месяца реакции.

Возможно ли получить SQL-запрос для этого без необходимости использования Excel?

благодаря

Предполагая, что четыре месяца действительно присутствуют в данных, вы можете сделать это, используя функции окна. Вы можете найти N вещей подряд, принимая разницу между двумя row_numbers() . Вот идея:

 with t as ( SELECT advertisable, EXTRACT(YEAR from day) as yy, EXTRACT(MONTH from day) as mon, ROUND(SUM(cost)/1e6) as val FROM adcube dac WHERE advertisable_eid IN (SELECT advertisable FROM adcube dac GROUP BY advertisable HAVING SUM(cost)/1e6 > 100 ) GROUP BY advertisable, EXTRACT(YEAR from day), EXTRACT(MONTH from day) ) select advertisable, min(yy * 10000 + mon) as yyyymm from (select t.*, (row_number() over (partition by advertisable order by yy, mon) - row_number() over (partition by advertisable, val order by yy, mon) ) as grp from t ) group by advertisable, grp, val having count(*) >= 4 and val = 0;