如何在 CASE 中只计算一次相同的行? SQL

How to count the same lines only once in CASE? SQL

我有 table,其中包含 ID、时间和事件(A 或 B)。我需要写一个案例(或其他条件),在 table 条目中找到 event='B' 并计算一次,按 id 分组。

例如, 对于 id 1:table 与事件 B 一致,因此计数器 1。 对于 id 2:table 与事件 B 一致,因此计数器 1。 对于 id 3:table 不符合事件 B,因此计数器 0。 对于 id 4:table 与事件 B 一致,因此计数器 1.

然后它计算百分比,在我的示例中它将是 (1+1+0+1)*100/4 = 75%

id 日期时间 事件
1 2021-04-0115:00:00 一个
1 2021-04-0115:00:00 B
1 2021-04-0115:00:00 B
2 2021-04-0121:00:00 一个
2 2021-04-0521:00:00 B
3 2021-04-0510:00:00 一个
1 2021-04-0715:00:00 B
4 2021-04-10 17:00:00 一个
4 2021-04-1117:00:00 B
4 2021-04-1117:00:00 B

试试这个:

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 │
└────────────────┴─────────────────┴────────────┘
*/