创建列的范围桶

Creating Range Buckets of column

我有一个名为 test_table 的基地 table,我正在用它计算年龄,结果如期而至。

这是我用于年龄计算的查询。

select acol,
       DATEDIFF(hour,CONVERT(DATEADD('SECOND', (epoch_time)/1000, DATE '1970-01-01'), DATE), CURRENT_TIMESTAMP()) AS age
from test_table;

但现在我想创建不同范围的年龄列,通过修改现有查询将其显示为结果。

范围为:

1000-2000

2000-3000

3000-4000

ACOL       AGE  
MAG        1168
MAG        2168
MAG        3168
MAG        1100
MAG        2168
PNB        1672
MUM        1600
MUM        2696
MUM        3696
MUM        1696

查询成功后的结果必须如下所示table。

ACOL 1000-2000  2000-3000 3000-4000
MAG      2          2          1
PNB      1          0          0
MUM      2          1          1

我知道我们可以使用 select 案例来做到这一点,但无法构建工作查询。 谁能帮我解决这个问题。

提前致谢。

您可以将条件聚合与 CASE 表达式一起使用:

SELECT t.ACOL,
       SUM(CASE WHEN t.AGE >= 1000 AND t.AGE < 2000 THEN t.AGE ELSE 0 END) AS `1000-2000`,
       SUM(CASE WHEN t.AGE < 3000 THEN t.AGE ELSE 0 END) AS `2000-3000`,
       SUM(CASE WHEN t.AGE < 3000 AND t.AGE < 4000 THEN t.AGE ELSE 0 END) AS `3000-4000`
FROM
(
    SELECT ACOL,
           DATEDIFF(HOUR, CONVERT(DATEADD(SECOND, (epoch_time)/1000, DATE '1970-01-01'), DATE), CURRENT_TIMESTAMP()) AS AGE
    FROM test_table
) t
GROUP BY t.ACOL
SELECT ACOL,
       COUNT(CASE WHEN AGE >= 1000 AND AGE < 2000 THEN AGE ELSE NULL END) AS `1000-2000`,
       COUNT(CASE WHEN AGE >= 2000 AGE < 3000  THEN AGE ELSE NULL END) AS `2000-3000`,
       COUNT(CASE WHEN AGE >= 3000 AND AGE < 4000 THEN AGE ELSE NULL END) AS `3000-4000`
FROM (select ACOL,DATEDIFF(hour,CONVERT(DATEADD('SECOND', (epoch_time)/1000, DATE '1970-01-01'), DATE), CURRENT_TIMESTAMP()) AS AGE FROM test_table )
GROUP BY ACOL

修改了 from 子句... 在职的 ... :)