SQL: Как подсчитать количество клиентов, которые уже купили тот же продукт? - PullRequest
1 голос
/ 10 июня 2011

У меня есть таблица, подобная приведенной ниже. Это запись ежедневных продуктов и клиентов, которые их приобрели (аналог сайта ежедневных сделок). Данный клиент может приобрести продукт только один раз за функцию, но он может приобрести один и тот же продукт, если он представлен несколько раз.

FeatureID | ClientID | FeatureDate | ProductID  
 1           1002      2011-05-01      500  
 1           2333      2011-05-01      500  
 1           4458      2011-05-01      500  
 2           8888      2011-05-10      700  
 2           2333      2011-05-10      700  
 2           1111      2011-05-10      700    
 3           1002      2011-05-20      500  
 3           4444      2011-05-20      500  
 4           4444      2011-05-30      500  
 4           2333      2011-05-30      500  
 4           1002      2011-05-30      500   

Я хочу посчитать по FeatureID количество клиентов, которые приобрели FeatureID X И которые приобрели тот же ProductID во время предыдущей функции.

Для таблицы выше ожидаемый результат будет:

FeatureID | CountofReturningClients  
 1          0  
 2          0  
 3          1  
 4          3

В идеале я хотел бы сделать это с помощью SQL, но я также готов выполнять некоторые манипуляции в Excel / PowerPivot. Спасибо !!

Ответы [ 4 ]

1 голос
/ 10 июня 2011

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

SELECT t_current.FEATUREID, COUNT(DISTINCT t_prior.CLIENTID)
FROM table_name t_current
LEFT JOIN table_name t_prior
ON t_current.FEATUREDATE > t_prior.FEATUREDATE
AND t_current.CLIENTID = t_prior.CLIENTID
AND t_current.PRODUCTID = t_prior.PRODUCTID
GROUP BY t_current.FEATUREID
0 голосов
/ 10 июня 2011

Допущения: у вас есть таблица с именем Features, которая:

FeatureID, FeatureDate, ProductID

Если нет, то вы всегда можете создать его на лету с временной таблицей, cte или view.

Тогда:

SELECT

FeatureID

, (
    SELECT COUNT(DISTINCT ClientID) FROM Purchases WHERE Purchases.FeatureDate < Feature.FeatureDate AND Feature.ProductID = Purchases.ProductID

) as CountOfReturningClients

FROM Features
ORDER BY FeatureID
0 голосов
/ 10 июня 2011

Новое в этом, но разве не следующая работа?

SELECT     FeatureID, (CASE WHEN COUNT(clientid) > 1 THEN COUNT(clientid) ELSE 0 END)
FROM         table
GROUP BY featureID
0 голосов
/ 10 июня 2011

«Для каждой функции подсчитывать клиентов, которые соответствуют любым более ранним функциям с тем же продуктом»

SELECT
   Curr.FeatureID
   COUNT(DISTINCT Prev.ClientID) AS CountofReturningClients --edit thanks to feedback
FROM
   MyTable Curr
   LEFT JOIN
   MyTable Prev WHERE Curr.FeatureID > Prev.FeatureID
                        AND Curr.ClientID = Prev.ClientID
                        AND Curr.ProductID = Prev.ProductID
GROUP BY
   Curr.FeatureID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...