Создание диапазонов диапазонов столбца

У меня есть одна базовая таблица с именем test_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

Результат после успешного запроса должен выглядеть следующим образом.

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

Я знаю, что мы можем сделать это, используя select case, но не в состоянии построить рабочий запрос. может кто-нибудь помочь мне в этом.

заранее спасибо.

2 ответа

Решение

Вы можете использовать условное агрегирование с 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... Работает...:)

Другие вопросы по тегам