Я пытаюсь найти процентное увеличение за последние 7 дней, но я немного застрял. В настоящее время в запросе SQL, который я создал, вы можете получить общее количество новых учетных записей за последние 7 дней. Но теперь, как я могу улучшить, чтобы вернуть результат в процентах?
Вот запрос SQL, сделанный до сих пор.
Спасибо
SELECT COUNT(DISTINCT account_type)
FROM account
WHERE date_created > NOW() - INTERVAL 7 DAY
Предполагая, что у вас есть одна строка на одну учетную запись, вам не нужно distinct
. Я предполагаю, что вы хотите:
SELECT (SUM(date_created >= CURDATE() - INTERVAL 7 DAY) * 100/
SUM(date_created > CURDATE() - INTERVAL 7 DAY)
) as percent_increase
FROM account
Вы можете создать временную таблицу с двумя столбцами, например "старый счет" и "новый счет". Заполните таблицу значениями, полученными от запросов SELECT. Затем извлеките значения из таблицы temp, чтобы вычислить процентную разницу и удалить временную таблицу.
С целью запуска всего в одном запросе вы можете рассмотреть следующий запрос:
SELECT
/* Count for previous period. */
beforeCount,
/* Count for current period. */
afterCount,
/* Simple math, just calculating percentage. */
(beforeCount * 100) / afterCount AS percent
FROM (
SELECT
/* Select count for previous period. */
(
SELECT COUNT(DISTINCT account_type)
FROM account
WHERE date_created BETWEEN NOW() - INTERVAL 14 DAY AND NOW() - INTERVAL 7 DAY
) AS beforeCount,
/* Select count for current period. */
(
SELECT COUNT(DISTINCT account_type)
FROM account
WHERE date_created > NOW() - INTERVAL 7 DAY
) AS afterCount
) AS tmp
Условная агрегация может работать. Используйте CASE
чтобы считать только новые и другие, чтобы считать только старые учетные записи.
SELECT count(DISINCT CASE
WHEN date_created > NOW() - INTERVAL 7 DAY THEN
account_type
END)
/
count(DISTINCT CASE
WHEN date_created <= NOW() - INTERVAL 7 DAY THEN
account_type
END)
* 100 increase
FROM account;
С временной таблицей вы можете сделать так:
create temporary table storeCount IF NOT EXISTS (
oldCount INT(10) not null,
newCount INT(10) not null
);
insert into percentage (oldCount,newCount)
values
(SELECT COUNT(DISTINCT acc1.account_type)FROM account acc1, SELECT COUNT(DISTINCT acc2.account_type)
FROM account acc2 WHERE acc2.date_created > NOW() - INTERVAL 7 DAY);
select ((newCount/oldCount)*100) as percentage from storeCount;
drop temporary table IF EXISTS storeCount;
вы можете попробовать ниже, рассчитать последний счет в 7 дней, а затем рассчитать до 7 дней, а затем рассчитать процент
select max(last7days_count) as last7days_count,
max(before7days_count) as before7days_count,
((max(before7days_count)*1.00)/max(last7days_count))*100.00 as percentage from
(
SELECT COUNT(DISTINCT account_type) as last7days_count, 0 as before7days_count
FROM account
WHERE date_created > NOW() - INTERVAL 7 DAY
union all
SELECT 0 as last7days_count COUNT(DISTINCT account_type) as before7days_count
FROM account
WHERE date_created < NOW() - INTERVAL 7 DAY
) as T