2010-12-07 5 views
1

Для расчета clustering coefficient я создал следующий запрос:Общие Таблица Экспрессия Выпуск

--calculate embeddedness and local_gatekepping_role_count (for two-way connections) 
    declare @observedUser varchar(50) 
    declare @clusteringCoefficient decimal(18, 7) 
    declare @possibleConnectionsCount int 
    declare @neighborConnectionsCount int 
    declare @rowsAffected int 
    SET @rowsAffected = 1; 
    WHILE @rowsAffected > 0 
    BEGIN 
    SELECT TOP 1 @observedUser = msisdn FROM users_in_group_91 WHERE clustering_coefficient IS NULL 
    SET @rowsAffected = @@ROWCOUNT 
    IF @rowsAffected = 0 break; 
    ;WITH neighbors AS 
    (
    SELECT called_party AS neighbor FROM connections_in_group_91 WHERE calling_party = @observedUser 
    UNION 
    SELECT calling_party AS neighbor FROM connections_in_group_91 WHERE called_party = @observedUser 
    ), 
    possibleConnections AS 
    (
    SELECT n1.neighbor AS user1, n2.neighbor AS user2 FROM neighbors n1 CROSS JOIN neighbors n2 WHERE n1.neighbor < n2.neighbor 
    ) 
    SELECT @clusteringCoefficient = CAST(COUNT(*) AS decimal)/(SELECT COUNT(*) FROM possibleConnections) FROM possibleConnections pc INNER JOIN connections_in_group_91 c91 ON c91.calling_party = pc.user1 AND c91.called_party = pc.user2 
    ) 
    UPDATE users_in_group_91 SET clustering_coefficient = @clusteringCoefficient WHERE msisdn = @observedUser 
    END 

, который работает fine.As было бы полезно, чтобы проверить, сколько раз наблюдал пользователь играет роль привратника я пытался изменить запрос выше следующим образом:

declare @observedUser varchar(50) 
    declare @clusteringCoefficient decimal(18, 7) 
    declare @gatekeepingRoleCount int 
    declare @possibleConnectionsCount int 
    declare @neighborConnectionsCount int 
    declare @rowsAffected int 
    SET @rowsAffected = 1; 
    WHILE @rowsAffected > 0 
    BEGIN 
    SELECT TOP 1 @observedUser = msisdn FROM users_in_group_91 WHERE clustering_coefficient IS NULL 
    SET @rowsAffected = @@ROWCOUNT 
    IF @rowsAffected = 0 break; 
    ;WITH neighbors AS 
    (
    SELECT called_party AS neighbor FROM connections_in_group_91 WHERE calling_party = @observedUser 
    UNION 
    SELECT calling_party AS neighbor FROM connections_in_group_91 WHERE called_party = @observedUser 
    ), 
    possibleConnections AS 
    (
    SELECT n1.neighbor AS user1, n2.neighbor AS user2 FROM neighbors n1 CROSS JOIN neighbors n2 WHERE n1.neighbor < n2.neighbor 
    ) 
    SELECT @possibleConnectionsCount = COUNT(*) FROM possibleConnections 
    SELECT @clusteringCoefficient = CAST(COUNT(*) AS decimal)/(@possibleConnectionsCount) FROM possibleConnections pc INNER JOIN connections_in_group_91 c91 ON c91.calling_party = pc.user1 AND c91.called_party = pc.user2 
    SET @gatekeepingRoleCount = @possibleConnectionsCount * (1 - @clusteringCoefficient) 
    UPDATE users_in_group_91 SET clustering_coefficient = @clusteringCoefficient, local_gatekeeping_role_count = @gatekeepingRoleCount WHERE msisdn = @observedUser 
    END 

но последний запрос возвращает ошибку: Msg 208, уровень 16, состояние 1, строка 25 Неверное имя объекта 'possibleConnections'.

Кто-нибудь знает, почему невозможно запросить одно и то же выражение несколько раз таким образом и как изменить указанный выше запрос, чтобы рассчитать @clusteringCoefficient и @gatekeepingRoleCount в том же цикле?

Спасибо!

+0

@KM от прошлой работы, похоже, что OP использует SO как удобную службу поддержки и совсем немного. – smirkingman 2010-12-07 14:11:27

ответ

1

CTE подходит только для следующего оператора.

В вашем случае, если вы избавитесь от скалярных переменных и просто поместите подзапросы inline, он должен работать.

+1

вы новичок здесь, но вы поймете это ... http://en.wikipedia.org/wiki/Parasite – 2010-12-07 14:16:32