如何在 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 │
└────────────────┴─────────────────┴────────────┘
*/
我有 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 │
└────────────────┴─────────────────┴────────────┘
*/