Предотвратить повторяющиеся значения, используя group by и считать разные одновременно? - PullRequest
0 голосов
/ 25 октября 2019

У меня есть простая таблица с годами и идентификатором клиента, и теперь я хочу группировать по годам и подсчитывать разных клиентов для каждого года. Это просто и работает нормально, моя проблема в том, что я не хочу, чтобы клиенты в 1-м году повторялись во 2-м, я только хочу видеть новых клиентов на каждый год. Так как мне это сделать?

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

select count (distinct customer ID), Year
FROM customers
group by year

Допустим, у меня есть 100 клиентов за период с 2015 по 2019 год, теперь у меня есть

Year No of Customers
2015   30
2016   35
2017   40
2018   30
2019   10

Всего 145, что на 45 больше, чем 100 То, что я хочу, это

Year  No of Customers
2015   30
2016   30
2017   20
2018   20
2019   10
Total  100 

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Если вы хотите подсчитать клиентов только за первый год их появления, используйте два уровня агрегации:

select min_year, count(*)
from (select customerid, min(year) as min_year
      from customers c
      group by customerid
     ) c
group by min_year
order by min_year;

Чтобы получить total, вы можете использовать grouping sets или rollup(не все базы данных поддерживают их. Типичный метод:

select min_year, count(*)
from (select customerid, min(year) as min_year
      from customers c
      group by customerid
     ) c
group by min_year with rollup;
0 голосов
/ 25 октября 2019

Возможно что-то вроде этого:

SELECT count (distinct c1.customerID), c1.Year 
FROM customers c1
WHERE c1.customerID not in (
    SELECT c2.customerID
    FROM customers c2
    WHERE c2.year < c1.year
)
GROUP BY year
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...