【问题标题】:How to count the same lines only once in CASE? SQL如何在 CASE 中只计算一次相同的行? SQL
【发布时间】:2021-09-02 05:11:32
【问题描述】:

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

例如, 对于 id 1:表与事件 B 对齐,因此计数器 1。 对于 id 2:表与事件 B 对齐,因此计数器 1。 对于 id 3:表没有与事件 B 对齐,所以计数器 0。 对于 id 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

【问题讨论】:

  • 请提供更多解释和您想要的结果。
  • Edit问题并提供minimal reproducible example,即涉及的表或其他对象的CREATE语句(粘贴文本,不要使用图像,不要链接到外部站点),INSERT 用于示例数据 (dito) 的语句以及带有表格文本格式的示例数据的所需结果。展示您已经尝试过的内容。解释失败的原因/位置。具体(错误消息、意外结果等)。

标签: sql case clickhouse


【解决方案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 │
└────────────────┴─────────────────┴────────────┘
*/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 2019-11-18
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多