创建列的范围桶
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 子句...
在职的 ...
:)
我有一个名为 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 子句... 在职的 ... :)