2012-05-10 3 views
2

Я озадачен тем, как построить алгоритм для определения среднего числа активных клиентов в нашей системе. Они содержат разнообразную информацию, идентификатор, дату начала контакта, дату окончания контакта, дату начала и окончания учетной записи, даты транзакций и т. Д. Не все из них имеют постоянную ежедневную активность, которую я мог бы захватить. Я не могу определить, как определить количество активных клиентов в определенную дату.SQL-код для определения средних дневных итогов

Я не могу существенно изменить структуру базы данных или изменить таблицы, поэтому мне нужно работать с тем, что у меня есть. Одна из идей, которая, по моему мнению, заключается в том, чтобы проверить, больше ли дата окончания контакта больше даты X или равна нулю, и проверить, не указана ли дата начала контакта меньше даты X. Я подключил это, но получил то же самое число за любой день, когда я вставляю. Есть ли другой способ попробовать это? Я мог бы добавить этот код, когда приступаю к работе, но сейчас я отправлю его на рассмотрение ...

** Извините, я оставил важный кусок. Мне нужно иметь возможность идентифицировать общий актив в любой конкретный день в прошлом, а затем получать среднесуточные суммы за год. Возможно, я разрешил первую часть этого с помощью приведенных ниже сообщений. Сначала я создал переменную в моем запросе, чтобы держать дату мне нужно искать ... @ report_dt

and contact_end_dt >= @report_dt 
and contact_start_dt <= @report_dt 

Этот кусок сделал это для меня. Теперь мне нужно выяснить, как это сделать через год, и увеличивать переменную @report_dt один день за раз.

Спасибо за помощь ... вы потрясающе! Doug

+0

Это SQL, не ищите петли. Создайте таблицу со всеми 365/366 днями, которые вас интересуют, и присоединитесь к ней. Или, всего за все активные дни, которые появляются в году и делятся на 365/366 ... * [A активен в течение 365 дней, B активен в течение 165 дней, C активен в течение 200 дней. Среднее - 2. Не важно, в какие дни они были активны, только то, что вы считаете дни, которые выпадают в год, о котором идет речь.] * – MatBailie

ответ

1

Если бы вы могли расширить немного, включив:
- код, который вы пробовали, но не работал
- Фактическая схема вашего стола (ов) (в том числе типов данных ограничений и т.д.)
- Пример входных и выходных данных

это выдерживая, простой запрос представляется, что вы хотите ...

SELECT 
    * 
FROM 
    yourTable 
WHERE 
     (contact_start_date >= CAST('20120510' AS DATETIME) OR contact_start_date IS NULL) 
    AND (contact_end_date <= CAST('20120510' AS DATETIME) OR contact_end_date IS NULL) 

(Хотя вы, возможно, не нужно проверять NULL даты начала в зависимости от ограничений данных.)

Если это дублирует то, что вы уже пробовали, я буду ждать любого обновления на свой вопрос :)

+0

Ницца ... это сделало это. Теперь я должен работать над годовой программой. – djailer

1

Не могли бы вы выполнить запрос, когда sysdate находится между датой начала контакта и датой окончания контакта?

У вас есть кодовая дата начала и дата окончания контакта, даты начала и окончания счета. Можете ли вы полагаться на данные в датах начала и окончания учетной записи? Как долго учетная запись не имеет активности до того, как она будет считаться неактивной? Если вы можете ответить на этот вопрос, вы сможете получить ответ.

Спасибо, Susan

0

Это интересная проблема. Следующий запрос решает проблему с помощью SQL Server и любую базу данных, которая поддерживает row_nubmer(), если у вас есть начинается и останавливается на все даты:

with starts as 
(
    select start_date as thedate, 
     row_number() over (partition by null order by start_date) as cumstarts 
    from customers 
), 
ends as 
(
    select end_date as thedate, 
     row_number() over (partition by null order by end_date) as cumends 
    from customers 
) 
select thedate, cumstarts - cumends 
from 
(
    (select * from starts) 
    union all 
    (select * from ends) 
) t 
group by thedate 

Некоторые базы данных предлагают накопленную сумму сразу, что делает его более легким.

Эта проблема немного запутанна в SQL Server, когда у вас есть запуск и остановка в разные даты.

1

Даг,

Вы не дали ни малейшего представления о том, что это значит для клиента быть «активным». Как только вы это выясните, вы можете решить эту проблему.

Можете ли вы написать запрос, в котором перечислены активные клиенты один раз, для, скажем, даты 2012-05-10? Если да, то

  1. Создайте отдельную таблицу дат, с одной строки на каждый день (или рабочий день)
  2. Использование запроса вы написали для 2012-05-10, но с левым внешним соединением из даты. Выберите только датуTable.theDate, count (*) и группу по дате.

Если вы хотите что-то более конкретное, поставьте что-то конкретное в своем вопросе. Беспроблемный вопрос без единого имени столбца или таблицы не поможет вам. Взгляните на вопросы здесь, чтобы получить upvotes, пожалуйста.

+0

Спасибо за критику. Я понимаю, что это было немного расплывчато :) Возможно, было слишком рано пытаться сформулировать последовательную мысль. Я знаю лучше, я думаю! – djailer

Смежные вопросы