Количество уникальных пользователей добавляет каждый месяц - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь получить SQL-запрос для подсчета уникального клиента за данный месяц, рассчитывать только в том случае, если Клиент не был участником каких-либо предыдущих месяцев.

date|       Customer_name
---------------------------------
2016/01/01  John
2016/01/01  Jane
2016/02/01  Joe
2016/02/01  Jill
2016/02/01  John
2016/03/01  Jane
2016/03/01  Jill
2016/03/01  Jay
2016/04/01  Jude

И я хочу рассчитывать только клиентаесли Клиент не был частью каких-либо предыдущих месяцев.

DATE       NEW_CUSTOMER_ADDS
-------------------------------------------------------
2016/01/01      2
2016/02/01      2
2016/03/01      1
2016/04/01      1

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Во-первых, давайте получим дату первого посещения каждого клиента:

SELECT
    Customer_name,
    MIN( [date] ) AS firstDate
FROM
    [TheTable]
GROUP BY
    Customer_name

Затем давайте получим информацию о месяце для этих firstDate значений (см. Как выбрать первый деньмесяц в SQL? ):

SELECT
    Customer_name,
    DATEFROMPARTS( YEAR( MIN( [date] ) ), MONTH( MIN( [date] ) ), 1 ) AS monthOfFirstDate
FROM
    [TheTable]
GROUP BY
    Customer_name

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

SELECT
    monthOfFirstDate,
    COUNT( * ) AS newCustomers
FROM
    (
        SELECT
            DATEFROMPARTS( YEAR( MIN( [date] ) ), MONTH( MIN( [date] ) ), 1 ) AS monthOfFirstDate
        FROM
            [TheTable]
        GROUP BY
            Customer_name
    ) AS customersFirstDateMonths
ORDER BY
    monthOfFirstDate
0 голосов
/ 22 октября 2018
SELECT
    COUNT(*),
    DATEADD( MONTH, DATEDIFF( MONTH, 0, [date] ), 0) AS [month]
FROM
    (
        SELECT
            Customer_name,
            [date]
        FROM
            (
                SELECT
                    Customer_name,
                    [date],
                    Row_number() OVER( PARTITION BY Customer_name ORDER BY [date] ) AS rn
                FROM
                    YourTable
            ) AS t
        WHERE
            rn = 1
    ) AS d
GROUP BY
    DATEADD( MONTH, DATEDIFF( MONTH, 0, [date] ), 0 ) 
ORDER BY
    [month]
0 голосов
/ 22 октября 2018

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

Попробуйте использовать фильтр WHERE NOT EXISTS ().

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