Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / самосоединение по дате - в чем ошибка ? / 3 сообщений из 3, страница 1 из 1
26.02.2002, 19:39
    #32023962
vovan_r
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
самосоединение по дате - в чем ошибка ?
Имеется таблица с полем datetime, куда заносится время входа пользователей в систему. Нужно вычислить количество входов (т.е. записей) за равные промежутки в днях [t0,t1][t1,t2]..[t(n-1),t(n)]. Например, сколько было входов за каждые 7 дней 6-го месяца 2001 года?

Придумал такое самосоединение (видел где-то аналогичное, но там вычисляли running total):

select convert(char(10),a.aDate,102),
min(b.aDate) as FromDate,
max(b.aDate) as ToDate,
count(b.aDate) as Qty
from EnterLog as a inner join EnterLog as b
on (b.aDate >= a.aDate and b.aDate < dateadd(dd,7,a.aDate))
where (a.aDate between '20010601' and '20010701')
and (datediff(dd,'20000101',a.aDate) % 30 = 0)
group by convert(char(10),a.aDate,102)
order by 1

Выдает полную ахинею (Qty превышает кол-во записей в таблице)
В чем ошибка, народ ? Помогите, плз.
...
Рейтинг: 0 / 0
26.02.2002, 20:19
    #32023964
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
самосоединение по дате - в чем ошибка ?
Выдает полную ахинею (Qty превышает кол-во записей в таблице)
Еще бы не ахинею. "Размножили" с помощью
EnterLog as a inner join EnterLog as b on (b.aDate >= a.aDate and b.aDate < dateadd(dd,7,a.aDate))
записи, вот их получилось больше, чем за надо



IMHO что-то вроде такого

select (day(a.aDate)-1)/7,
min(b.aDate) as FromDate,
max(b.aDate) as ToDate,
count(*) as Qty
from EnterLog as a
where (a.aDate between '20010601' and '20010630 23:59:59')
and (datediff(dd,'20000101',a.aDate) % 30 = 0)
group by (day(a.aDate)-1)/7
order by 1
...
Рейтинг: 0 / 0
27.02.2002, 03:09
    #32023973
Слон
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
самосоединение по дате - в чем ошибка ?
А у меня вот что используется для такой цели

DECLARE
@Period tinyint,
@StartDate smalldatetime,
@StopDate smalldatetime

SET @Period = 7
SET @StartDate = '20010601'
SET @StopDate = '20010701'

SELECT COUNT(*) AS QTY,
CONVERT(smalldatetime, FLOOR((FLOOR(CONVERT(float, aDate)) - FLOOR(CONVERT(float, @StartDate))) / CONVERT(float, @Period)) * @Period + FLOOR(CONVERT float, @StartDate))) AS FromDate,
CONVERT(smalldatetime, FLOOR((FLOOR(CONVERT(float, aDate)) - FLOOR(CONVERT(float, @StartDate))) / CONVERT(float, @Period)) * @Period + @Period + FLOOR(CONVERT(float, @StartDate))) AS ToDate
FROM EnterLog
WHERE aDate >= @StartDate AND aDate < @StopDate
GROUP BY
CONVERT(smalldatetime, FLOOR((FLOOR(CONVERT(float, aDate)) - FLOOR(CONVERT(float, @StartDate))) / CONVERT(float, @Period)) * @Period + FLOOR(CONVERT(float, @StartDate))),
CONVERT(smalldatetime, FLOOR((FLOOR(CONVERT(float, aDate)) - FLOOR(CONVERT(float, @StartDate))) / CONVERT(float, @Period)) * @Period + @Period + FLOOR(CONVERT(float, @StartDate)))
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / самосоединение по дате - в чем ошибка ? / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]