Добавить столбец для подсчета записей по уникальному идентификатору - PullRequest
0 голосов
/ 14 июля 2020

Я имею дело с данными о людях, которые посетили определенное место. У каждого человека есть свой уникальный PersonID, и каждый его визит имеет уникальный VisitID. Я бы хотел добавить в свой запрос столбец, который подсчитывает количество отдельных записей для каждого человека (т.е. подсчитывает и отображает количество посещений этого человека). Лог c имеет смысл в моей голове, но я не уверен в синтаксисе, и аналогичные вопросы, на которые я смотрел во время исследования, просто не совсем применимы к моей ситуации.

Итак, вот что я Я смотрю на:

SELECT
    PersonID,
    [a few other demographic fields we'll skip for now],
    VisitID,
    COUNT(DISTINCT VisitID) as PersonVisits

FROM VisitInfo
WHERE VisitID IS NOT NULL
ORDER BY PersonID, VisitID

И я надеюсь увидеть такие результаты:

PersonID   ...    VisitID      PersonVisits
------------------------------------------------
1001       ...    0277         2
1001       ...    1429         2
1002       ...    1103         1
1003       ...    0925         3
1003       ...    2276         3
1003       ...    5018         3

Я знаю, что счет PersonVisits будет просто повторяться для каждого из записей, но это то, с чем я могу справиться для целей этого проекта (если у кого-то нет предложений по улучшению этого аспекта запроса).

Моя основная проблема в том, что

  1. Я не уверен, что то, что я делаю, является правильным go об этом

и

В его нынешнем виде этот запрос выдает ошибку, что

Column PersonID недействителен в списке выбора, потому что он не содержится ни в агрегатной функции, ни в GROUP BY

Я не получал эту ошибку, пока не добавил функцию СЧЁТ в список выбора.

Я на правильном пути?

Ответы [ 4 ]

1 голос
/ 14 июля 2020

Другой вариант - оконная функция sum() over()

SELECT  PersonID,
        VisitID,
        PersonVisits = sum(1) over (partition by PersonID)
FROM VisitInfo
WHERE VisitID IS NOT NULL
ORDER BY PersonID, VisitID
1 голос
/ 14 июля 2020

Когда вы используете агрегаты в SQL (sum, count, et c), вам понадобится предложение GROUP BY:

SELECT
    PersonID,
    COUNT(DISTINCT VisitID) as PersonVisits

FROM VisitInfo
WHERE VisitID IS NOT NULL
GROUP BY PersonID
ORDER BY PersonID

Как правило, ВСЕ неагрегированные столбцы в вашем SELECT должно быть в GROUP BY

SELECT
    PersonID,
    [a few other demographic fields we''ll skip for now],
    VisitID,
    COUNT(DISTINCT VisitID) as PersonVisits

FROM VisitInfo
WHERE VisitID IS NOT NULL
GROUP BY     
PersonID,
    [a few other demographic fields we'll skip for now],
    VisitID,
ORDER BY PersonID, VisitID

Это, вероятно, даст вам странные / неверные результаты, поскольку ваш запрос, скорее всего, будет вводить дубликаты и быть очень плотно сгруппированы из-за значения в вашем SELECT

0 голосов
/ 14 июля 2020

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

SELECT
    t.PersonID,
    t.col1, t.col2, ...,
    t.VisitID,
    g.PersonVisits
FROM VisitInfo t
INNER JOIN (
  SELECT PersonID, COUNT(DISTINCT VisitID) PersonVisits
  FROM VisitInfo
  GROUP BY PersonID 
) g ON g.PesronID = t.PersonID
WHERE t.VisitID IS NOT NULL
ORDER BY t.PersonID, t.VisitID
0 голосов
/ 14 июля 2020

Вот как бы я это написал ...

    select person_id, demo1, demo2, demo3, count(distinct visitid) as visits
    from visitinfo
    where visitid is not null
    group by 1,2,3,4
    order by 1,2,3,4
...