Я пытаюсь запустить какой-то цикл в SQL Server 2008/TSQL, и я не уверен, должно ли это быть WHILE
или CURSOR
или и то, и другое. Конечным результатом является попытка просмотреть список пользовательских логинов, затем определить уникальных пользователей, а затем запустить цикл, чтобы определить, сколько посещений потребовалось для пользователя на сайте в течение 5 минут, вырванных каналом ,Запуск WHILE или CURSOR или оба в SQL Server 2008
Таблица: LoginHistory
UserID Channel DateTime DurationInSeconds
1 Website 1/1/2013 1:13PM 170
2 Mobile 1/1/2013 2:10PM 60
3 Website 1/1/2013 3:10PM 180
4 Website 1/1/2013 3:20PM 280
5 Website 1/1/2013 5:00PM 60
1 Website 1/1/2013 5:05PM 500
3 Website 1/1/2013 5:45PM 120
1 Mobile 1/1/2013 6:00PM 30
2 Mobile 1/1/2013 6:10PM 90
5 Mobile 1/1/2013 7:30PM 400
3 Website 1/1/2013 8:00PM 30
1 Mobile 1/1/2013 9:30PM 200
Я select
уникальных пользователей в новую таблицу следующим образом:
SELECT UserID
INTO #Users
FROM LoginHistory
GROUP BY UserID
Теперь функциональность я пытаюсь развивать это чтобы перебрать эти уникальные идентификаторы пользователя, заказать логины по дате времени, а затем подсчитать количество логинов, необходимых для перехода на 300 секунд.
Результирующий набор Я хотел бы надеяться попасть будет выглядеть примерно так:
UserID TotalLogins WebsiteLogins MobileLogins Loginsneededto5Min
1 4 2 2 2
2 2 2 0 0
3 3 3 0 3
4 1 1 0 0
5 2 1 1 2
Если бы я выполнять это на другом языке, я думаю, было бы что-то вроде этого: (А извинений, потому что это не полный, только там, где я думаю, что я собираюсь)
for (i in #Users):
TotalLogins = Count(*),
WebsiteLogins = Count(*) WHERE Channel = 'Website',
MobileLogins = Count(*) WHERE Channel = 'Mobile',
for (i in LoginHistory):
if Duration < 300:
count(NumLogins) + 1
** Ok - Я смеюсь над собой, как я комбинированную несколько различных языков/синтаксисом, но это, как я думаю о решении этого **
Мысли о хорошем способе выполнить это? Мое предпочтение заключается в использовании цикла, поэтому я могу продолжать писать логику if/then
в код.
Несмотря на то, что вы предпочитаете цикл, было бы приемлемым решение на основе набора? – HABO
@HABO Я открыт для других решений, но я знаю, что в конечном итоге мне понадобится другая логика, например, «какая сессия имела самую длинную продолжительность» или другие подобные вычисления. Благодарю. – mikebmassey
Похоже, что рекурсивный запрос будет делать то, что вы хотите. Также называются CTE, они объясняются здесь [http://msdn.microsoft.com/en-us/library/ms186243 (v = sql.105) .aspx). Якорь будет уникальными парами UserId/Channel, и рекурсия добавит логины обратно во времени до достижения желаемой продолжительности или другого условия завершения, например. максимальный возврат 3 месяца. – HABO