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

У меня есть таблица, которая выглядит следующим образом:

app_id  supplier_reached    creation_date   platform
10001       1            9/11/2018         iOS
10001       2            9/18/2018         iOS
10002       1            5/16/2018       android
10003       1            5/6/2018        android
10004       1            10/1/2018       android
10004       1            2/3/2018        android
10004       2            2/2/2018           web
10005       4            1/5/2018           web
10005       2            5/1/2018        android
10006       3            10/1/2018         iOS
10005       4            1/1/2018          iOS

Цель состоит в том, чтобы найти уникальное число app_id, представленных в месяц.

Если я просто сделаю count(distinct app_id)Я получу следующие результаты:

Group by month  count(app number)
     Jan              1
     Feb              1
     may              3
  september           1
   october            2

Однако приложение считается уникальным и на основе комбинации других полей.Например, для января месяца значение the app_id является одинаковым, однако комбинация app_id, supplier_reached и platform показывает разные значения, и, следовательно, app_id должен учитываться дважды.Следуя той же схеме, желаемый результат должен быть:

Group by month  Desired answer
     Jan              2
     Feb              2
     may              3
   september          2
    october           2

Наконец, в таблице может быть много других столбцов, которые могут или не могут способствовать уникальности приложения.

Есть ли способ сделать этот тип подсчета в SQL?

Я использую Redshift.

Ответы [ 4 ]

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

Как указано выше, в Redshift count(distinct ...) не работает с несколькими полями.

Вы можете сначала сгруппировать по столбцам, которые вы хотите быть уникальными, а затем считать записи следующим образом:

select month,count(1) as app_number 
from (
    select month,app_id,supplier_reached,platform
    from your_table
    group by 1,2,3,4
)
group by 1
0 голосов
/ 04 октября 2018

Твоя цель неверна.

Вы не хотите

to find the unique number of app_id submitted per month

Вы хотите

to find the unique number of app_id + supplier_reached + platform submitted per month.

И так, вам нужноиспользуйте а) комбинацию столбцов типа count(distinct col1||col2||col3) или b)

select t1.month, count(t1.*)
  (select distinct 
         app_id, 
         supplier_reached,  
         platform, 
         month 
   from sometable) t1
group by month
0 голосов
/ 04 октября 2018

На самом деле, вы можете считать различные ROW значения удобно в Postgres:

SELECT month, count(DISTINCT (app_id, supplier_reached, platform)) AS dist_apps
FROM   tbl
GROUP  BY 1;

Ключевое слово ROW здесь будет просто шумом:

count(DISTINCT ROW(app_id, supplier_reached, platform))

Я бы не рекомендовал объединять столбцы для этой цели.Это сравнительно дорого, подвержено ошибкам (представьте различные типы данных и представление text, зависящее от локали) и вносит ошибки в угловом регистре, если используемый разделитель может содержаться в значениях столбца.

Увы, не поддерживается Redshift :

...
Value expressions
    Subscripted expressions  
    Array constructors  
    Row constructors
...
0 голосов
/ 04 октября 2018

Я не думаю, что Postgres или Redshift поддерживают COUNT(DISTINCT) с несколькими аргументами.Одним из обходных путей является использование конкатенации:

count(distinct app_id || ':' || supplier_reached || ':' || platform)
...