在括号之间的 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);