Подсчитайте разные значения для первого поля 'group by', пока их два - PullRequest
0 голосов
/ 07 апреля 2020

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

sel  WEEK
, DESCRIPTION 
, count(*) as DOC_CNT
,count(distinct USER_ID) as USER_CNT
from THE_TABLE_1
group by 1,2;

Я хотел бы подсчитывать разных пользователей каждую неделю, независимо от поля ОПИСАНИЕ. Вы знаете какой-нибудь элегантный способ получить это? Я использую движок Teradata, если это будет иметь значение.

Спасибо

РЕДАКТИРОВАТЬ: ввод выглядит так:

    DOC_NO  USER_ID DT  WEEK    day_of_week DESCRIPTION
1   0019071988  AC_N490314  10/03/2020  10  3   Maintain Business Partner
2   0018864387  AC_SSELVAM1 03/03/2020  9   3   Customer Change
3   0018840898  AC_RHARIHAR1    02/03/2020  9   2   Change Asset
4   0018883336  AC_AGNANA1  03/03/2020  9   3   Create Asset
5   0017743110  AC_DKUPPUSA1    03/02/2020  5   2   Change Bank
6   0017946108  AC_SMADHESH 07/02/2020  5   6   Create Supplier
7   0019573163  AC_SJAYACHA1    26/03/2020  12  5   Select Idocs
8   0017660339  AC_SSELVAM1 31/01/2020  4   6   Create material
9   0018324802  AC_DKUPPUSA1    18/02/2020  7   3   VIM Workplace
10  0019161678  AC_N478361  14/03/2020  10  7   Release Blocked Invoices

и вывод должен быть таким, как показано ниже, хотя значения USER_CNT здесь просчитаны.

    WEEK    DESCRIPTION DOC_CNT USER_CNT
1   10  Reset Cleared Items 229 13
2   3   Maintain Business Partner   600 10
3   4   Data Capture/Indexing Invoice   4,974   31
4   7   Other   1,207   54
5   9   Check VIM Business Rules    2,132   23
6   6   Check VIM Business Rules    2,863   29
7   5   Other   1,096   52
8   12  Check VIM Business Rules    1,390   19
9   4   Check VIM Business Rules    2,710   27
10  4   Other   1,462   56

1 Ответ

0 голосов
/ 07 апреля 2020

Я думаю, что проблема в том, что вы группируете строки, используя поле description в вашем текущем запросе:

COUNT(*) AS doc_cnt, -- # rows per week / description
COUNT(DISTINCT user_id) AS user_cnt -- # distinct users per week / description

Из того, что я понимаю, вы хотите # documents and distinct users per week, regardless of description. Предполагая, что это одна строка на документ, вы можете сделать что-то вроде этого:

SELECT 
  src.week, 
  MAX(src.docs_per_week) AS docs_per_week, 
  COUNT(*) AS users_per_week
FROM (
  SELECT 
    week, 
    COUNT(*) OVER(PARTITION BY week) AS docs_per_week -- # rows per week
  FROM the_table_1
  QUALIFY ROW_NUMBER() OVER(PARTITION BY week, user_id) = 1 -- Remove duplicate users
) src
GROUP BY src.week -- One row per week

...