TSQL интеллектуального анализа данных временных рядов - PullRequest
3 голосов
/ 21 апреля 2011

Возьмите таблицу SQL со следующими 3 полями:

Id,TimeStamp,Item,UserId

Я хотел бы определить наиболее распространенные последовательности Item для UserId в сеансе.Сеанс будет просто определяться пороговым значением времени (т. Е. Если в течение X минут не будет записей, любые будущие записи будут сгруппированы в новый сеанс).

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

Кто-нибудь знает, как можно решить эту проблему в SQL?

Обновление
Чтобы уточнить, давайте представим, что Предметы - это островки продуктового магазина.И у меня есть месяц людей, посещающих продуктовый магазин.Основной вопрос заключается в том, какие острова используют люди и какой порядок.Они чаще всего ходят по островам 1,2,3 или 1,2,1,3,4?

(Сейчас мне любопытно узнать о путях пользователей на наших сайтах, но вы знаете, продуктовый магазин более нагляден).

Обновление 2:
Здесьэто простой случай:

CREATE Table #StoreActivity
(
    id int,
    CreationDate datetime ,
    Isle int,
    UserId int
)

Insert INTO #StoreActivity
Values
    (1, CAST('12-1-2011 03:10:01' AS Datetime), 1, 2222),
    (2, CAST('12-1-2011 03:10:07' AS Datetime), 1, 1111),
    (3, CAST('12-1-2011 03:10:12' AS Datetime), 2, 2222),
    (4, CAST('12-1-2011 04:10:01' AS Datetime), 1, 2222),
    (5, CAST('12-1-2011 04:10:23' AS Datetime), 2, 2222)

Select * from #StoreActivity
DROP Table #StoreActivity

/* So with the above data, we have 2 sequences if we declare a session or visit dead if there is no activity for a minute : `1,2` (With a count of 2), and `1` (with a count of 1)*/

Ответы [ 2 ]

1 голос
/ 21 апреля 2011
WITH    q AS
        (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY TimeStamp, Id) AS rn,
                ROW_NUMBER() OVER (PARTITION BY UserId, Item ORDER BY TimeStamp, Id) AS rnd
        FROM    mytable
        )
SELECT  *,
        rnd - rn AS sequence
FROM    q

Столбец sequence будет общим для всех записей в последовательности для данного UserId. Вы можете группировать по ней или делать что угодно.

0 голосов
/ 06 октября 2011

Это звучит как старая проблема извлечения правил ассоциации моды (но упорядочено, что облегчает ее), и, если я правильно понял вопрос, нет ни одного [ЭФФЕКТИВНОГО] SQL-ответа на эту проблему.

  • Если ваша проблема связана с максимально частым майнингом маршрута (например, маршрут 1,3,2 можно использовать на обоих маршрутах 4,1,3,2 и 1,3,2,4), это не будеттак легко решить.Я бы посоветовал взглянуть на AR mining в SSAS data mining.

  • Если ваша проблема не связана с максимально частым майнингом маршрутов (например, 1,3,2 будет засчитано, только если оно точно такое жемаршрут, который он использовал), тогда это просто вопрос группирования и подсчета.

Прежде чем вы сможете использовать любое из вышеперечисленных решений, вам нужно выяснить, какие сеансы могутсделать это с помощью следующего сценария:

WITH ts as
(
    SELECT 
        id,
        UserId, 
        CreationDate,
        Isle,
        ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY CreationDate) AS rowNum
    FROM #StoreActivity a

)
SELECT t2.*, KeepSession = CASE WHEN DATEDIFF(second,t1.CreationDate, t2.CreationDate) > 60 THEN 0 ELSE 1 END   
INTO #tempStore
FROM ts as t1
LEFT JOIN ts as t2 ON t1.rowNum = t2.rowNum - 1 
WHERE t1.UserId = t2.UserId

SELECT *, id, UserId, 
SessionId = (SELECT count(*) FROM #tempStore where KeepSession = 0 and UserId = t.UserId and rowNum <= t.rowNum)
FROM #tempStore t
--where t. t.KeepSession = 0

DROP TABLE #tempStore

Результат будет:

id          UserId      CreationDate            Isle        rowNum               KeepSession id          UserId      SessionId
----------- ----------- ----------------------- ----------- -------------------- ----------- ----------- ----------- -----------
3           2222        2011-12-01 03:10:12.000 2           2                    1           3           2222        0
4           2222        2011-12-01 04:10:01.000 1           3                    0           4           2222        1
5           2222        2011-12-01 04:10:23.000 2           4                    1           5           2222        1
6           2222        2011-12-01 04:10:24.000 3           5                    1           6           2222        1
7           2222        2011-12-01 04:12:23.000 3           6                    0           7           2222        2
8           2222        2011-12-01 04:12:24.000 3           7                    1           8           2222        2

(6 row(s) affected)

ПРИМЕЧАНИЕ. Приведенное выше решение можно оптимизировать для повышения производительности.#tempStore можно удалить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...