在括号之间的 CTE 中聚合,以备后用
Aggregate in CTE between brackets to use in case after
我有这个 table(这是一个部分),我将其用作涉及聚合和 cube() 函数的第二部分查询的 CTE。在查询的第二部分,我有一个 event_id 计数的案例条件,其中 bsp 在某些范围括号之间。
╔═══════════╦════════╗
║ EVENT_ID ║ BSP ║
╠═══════════╬════════╣
║ 146305074 ║ 3.61 ║
╠═══════════╬════════╣
║ 146305074 ║ 3.65 ║
╠═══════════╬════════╣
║ 146305074 ║ 4.00 ║
╠═══════════╬════════╣
║ 146305074 ║ 11.86 ║
╠═══════════╬════════╣
║ 146305074 ║ 20.79 ║
╠═══════════╬════════╣
║ 146305074 ║ 24.85 ║
╠═══════════╬════════╣
║ 146305074 ║ 35.83 ║
╠═══════════╬════════╣
║ 146305074 ║ 155.41 ║
╚═══════════╩════════╝
在查询的第二部分,我有一个 event_id 计数的案例条件,其中 bsp 在一些范围括号之间。
CASE
WHEN td.BSP <= 2 THEN '01-02'
WHEN td.BSP <= 3 THEN '02-03'
WHEN td.BSP <= 5 THEN '03-05'
WHEN td.BSP <= 8 THEN '05-08'
WHEN td.BSP <= 13 THEN '08-13'
WHEN td.BSP <= 21 THEN '13-21'
WHEN td.BSP <= 34 THEN '21-34'
WHEN td.BSP <= 55 THEN '34-55'
WHEN td.BSP <= 89 THEN '55-89'
WHEN td.BSP <= 1000 THEN '89-1000'
END
以上是我必须为每个 event_id 对 BSP 进行分组的范围
但我必须显示这种情况发生的次数并据此进行分类。例如,使用此数据,我的预期结果将是
a count of 3 for BSP <=5
a count of 1 for BSP <=13
a count of 1 for BSP <=21
a count of 1 for BSP <=34
a count of 1 for BSP <=1000
但是第二部分我想有一个案例,我可以 select 这个数量的 event_id 并根据这个给他们一个值:
CASE
WHEN "count of event id" = 1 THEN '01'
WHEN"count of event id" in (2,3) THEN '02-03'
WHEN "count of event id" >3 THEN '04-1000'
END
AS label
查询和测试数据的完整信息在 Fiddle 中,只是为了清楚这个特定错误,应该发生的是列 "Bracket label" 不应该将所有值放入根据 'Price Bracket Count' 块中的 select 的括号“04-1000”。但应显示事件 ID 在该 BSP 括号中的次数。
如果我没理解错的话,你可以定义组然后使用group by
:
SELECT v.grp, COUNT(*)
FROM td CROSS APPLY
(values (CASE WHEN td.BSP <= 2 THEN '01-02'
WHEN td.BSP <= 3 THEN '02-03'
WHEN td.BSP <= 5 THEN '03-05'
WHEN td.BSP <= 8 THEN '05-08'
WHEN td.BSP <= 13 THEN '08-13'
WHEN td.BSP <= 21 THEN '13-21'
WHEN td.BSP <= 34 THEN '21-34'
WHEN td.BSP <= 55 THEN '34-55'
WHEN td.BSP <= 89 THEN '55-89'
WHEN td.BSP <= 1000 THEN '89-1000'
END)
) v(grp)
GROUP BY grp
ORDER BY MIN(td.BSP);
我有这个 table(这是一个部分),我将其用作涉及聚合和 cube() 函数的第二部分查询的 CTE。在查询的第二部分,我有一个 event_id 计数的案例条件,其中 bsp 在某些范围括号之间。
╔═══════════╦════════╗
║ EVENT_ID ║ BSP ║
╠═══════════╬════════╣
║ 146305074 ║ 3.61 ║
╠═══════════╬════════╣
║ 146305074 ║ 3.65 ║
╠═══════════╬════════╣
║ 146305074 ║ 4.00 ║
╠═══════════╬════════╣
║ 146305074 ║ 11.86 ║
╠═══════════╬════════╣
║ 146305074 ║ 20.79 ║
╠═══════════╬════════╣
║ 146305074 ║ 24.85 ║
╠═══════════╬════════╣
║ 146305074 ║ 35.83 ║
╠═══════════╬════════╣
║ 146305074 ║ 155.41 ║
╚═══════════╩════════╝
在查询的第二部分,我有一个 event_id 计数的案例条件,其中 bsp 在一些范围括号之间。
CASE
WHEN td.BSP <= 2 THEN '01-02'
WHEN td.BSP <= 3 THEN '02-03'
WHEN td.BSP <= 5 THEN '03-05'
WHEN td.BSP <= 8 THEN '05-08'
WHEN td.BSP <= 13 THEN '08-13'
WHEN td.BSP <= 21 THEN '13-21'
WHEN td.BSP <= 34 THEN '21-34'
WHEN td.BSP <= 55 THEN '34-55'
WHEN td.BSP <= 89 THEN '55-89'
WHEN td.BSP <= 1000 THEN '89-1000'
END
以上是我必须为每个 event_id 对 BSP 进行分组的范围 但我必须显示这种情况发生的次数并据此进行分类。例如,使用此数据,我的预期结果将是
a count of 3 for BSP <=5
a count of 1 for BSP <=13
a count of 1 for BSP <=21
a count of 1 for BSP <=34
a count of 1 for BSP <=1000
但是第二部分我想有一个案例,我可以 select 这个数量的 event_id 并根据这个给他们一个值:
CASE
WHEN "count of event id" = 1 THEN '01'
WHEN"count of event id" in (2,3) THEN '02-03'
WHEN "count of event id" >3 THEN '04-1000'
END
AS label
查询和测试数据的完整信息在 Fiddle 中,只是为了清楚这个特定错误,应该发生的是列 "Bracket label" 不应该将所有值放入根据 'Price Bracket Count' 块中的 select 的括号“04-1000”。但应显示事件 ID 在该 BSP 括号中的次数。
如果我没理解错的话,你可以定义组然后使用group by
:
SELECT v.grp, COUNT(*)
FROM td CROSS APPLY
(values (CASE WHEN td.BSP <= 2 THEN '01-02'
WHEN td.BSP <= 3 THEN '02-03'
WHEN td.BSP <= 5 THEN '03-05'
WHEN td.BSP <= 8 THEN '05-08'
WHEN td.BSP <= 13 THEN '08-13'
WHEN td.BSP <= 21 THEN '13-21'
WHEN td.BSP <= 34 THEN '21-34'
WHEN td.BSP <= 55 THEN '34-55'
WHEN td.BSP <= 89 THEN '55-89'
WHEN td.BSP <= 1000 THEN '89-1000'
END)
) v(grp)
GROUP BY grp
ORDER BY MIN(td.BSP);