Статистика... Как?

Andriuska
Дата: 17.01.2001 12:36:00
Приветствую вас, мудрые У...

Задачка такая вот... Есть небольшое кол-во клиентов (40 000). И имеют они свойство миграции, т. е. по причине неоплаты мы их отключаем, и так далее. Есть таблица, которая все это движение фиксирует, а имнно - номер клиента, дату отключения (подключения), состояние нынешнее, состояние предыдущее. И вот тут... При запросе надо откинуть тех, у кого было так: 2000.12.05 переведен из подключенных в отключенных по причине неуплаты, а 2000.12.07 опять из отключенных в подключенных... Вот... прибежал, расплакался, денежку зплатил, сказал, что больше так небудет. Типичный пример абонента кабельного ТВ. Помогите пожалуйста, а? Может кто что нибудь подобное делал?
SergSuper
Дата: 17.01.2001 15:05:47
Вообще-то трудно понять что-же тебе нужно. По-моему если ты сформулируешь, не кого надо "откинуть", а кого всё-таки надо выбрать - то сам всё и напишешь.
Slava Sedov
Дата: 17.01.2001 16:30:04
это что-то типа системы шумоподавления?...

попробуй self-join (жутко полезная штука)... нечто вроде

select {field list} from {SameTable} as T1
inner join {SameTable} as T2 where T1.UserID=T2.UserID and T1.NewStatus=1 and T2.NewStatus=0
and datediff(day, T2.OperationDate, T1.OperationDate) > @noiselevel and {прочие условия};

вместо параметра/переменной @noiselevel можно просто явно указать минимальное количество дней между датами отключения/подключения. Кроме того есть смысл (зависит от прочих условий) задать максимальное количество дней между датами (используй between). Предупреждаю что оптимизатор на этом запросе точно ласты завернет.... хотя 40 килострок в квадрате - не проблема если колонка UserID проиндексирована, конечно, ну и для прочих условий лучше все что надо тоже проиндексировать (индекс по OperationDate тоже слегка поможет)
VadimB
Дата: 17.01.2001 18:49:04
Задачу я понял так:
есть таблица T - подключения и отключения клиентов с полями:
UserID --номер клиента,
Date -- дату отключения (подключения),
NewStatus --состояние нынешнее (0,1),
OldStatus --состояние предыдущее(0,1)

Необходимо выбрать клиентов, которыt за период с @a до @b не были отключены и повторно подключены

Select t.UserID From T t
Where Not exists ( select * from From T t1, T t2
where t.UserID=t1.UserID and t.UserID=t2.UserID
and @a<=t1.Date and t1.Date<=t2.Date and t2.Date<=@b
and t1.NewStatus=0 and t2.NewStatus=1
)