Как посчитать одни и те же строки только один раз в CASE? SQL

У меня есть таблица с идентификатором, временем и событием (A или B). Мне нужно написать случай (или другое условие), который находится в записи таблицы, где event = 'B', и подсчитывает его один раз, группируя по идентификатору.

Например, для идентификатора 1: в таблице есть строка с событием B, поэтому счетчик 1. для идентификатора 2: в таблице есть строка с событием B, поэтому счетчик 1. для идентификатора 3: в таблице нет строки с событием B, поэтому счетчик 0. для идентификатора 4: в таблице есть строка с событием B, поэтому счетчик 1.

И затем он считает процент, в моем примере это будет (1 + 1 + 0 + 1) * 100/4 = 75%.

id DateTime event
1 2021-04-01 15:00:00 A
1 2021-04-01 15:00:00 B
1 2021-04-01 15:00:00 B
2 2021-04-01 21:00:00 A
2 2021-04-05 21:00:00 B
3 2021-04-05 10:00:00 A
1 2021-04-07 15:00:00 B
4 2021-04-10 17:00:00 A
4 2021-04-11 17:00:00 B
4 2021-04-11 17:00:00 B

person Regina    schedule 17.06.2021    source источник
comment
Пожалуйста, предоставьте дополнительные объяснения и желаемые результаты.   -  person Gordon Linoff    schedule 17.06.2021
comment
Отредактируйте вопрос и укажите минимальный воспроизводимый пример, т. е. CREATE операторы таблиц или других задействованных объектов (вставьте текст, не используйте изображения, не ссылайтесь на внешние сайты), INSERT операторы для образцов данных (dito) и желаемый результат с этими образцами данных в табличном текстовом формате. Покажите, что вы уже пробовали. Объясните, почему / где это не удалось. Будьте конкретны (сообщение об ошибке, неожиданный результат и т. Д.).   -  person sticky bit    schedule 17.06.2021
comment
stackoverflow.com/a/67828913/11644308   -  person Denny Crane    schedule 17.06.2021


Ответы (1)


Попробуй это:

SELECT
    uniq(id) AS uniqEventCount,
    uniqIf(id, event = 'B') AS uniqBEventCount,
    (uniqBEventCount * 100) / uniqEventCount AS percentage
FROM (
  /* emulate the test dataset */
  SELECT data.1 AS id, data.2 AS DateTime, data.3 AS event
  FROM (
    SELECT arrayJoin([
      (1, '2021-04-01 15:00:00', 'A'),
      (1, '2021-04-01 15:00:00', 'B'),
      (1, '2021-04-01 15:00:00', 'B'),
      (2, '2021-04-01 21:00:00', 'A'),
      (2, '2021-04-05 21:00:00', 'B'),
      (3, '2021-04-05 10:00:00', 'A'),
      (1, '2021-04-07 15:00:00', 'B'),
      (4, '2021-04-10 17:00:00', 'A'),
      (4, '2021-04-11 17:00:00', 'B'),
      (4, '2021-04-11 17:00:00', 'B')]) as data))

/*
┌─uniqEventCount─┬─uniqBEventCount─┬─percentage─┐
│              4 │               3 │         75 │
└────────────────┴─────────────────┴────────────┘
*/
person vladimir    schedule 17.06.2021