Импала sql транспонирование / поворот 1 строки в столбцы или альтернативный метод группировки по диапазону - PullRequest
0 голосов
/ 20 марта 2020
SELECT 
    SUM(CASE WHEN age >= 80 THEN 1 ELSE 0 END) AS '>=80',
    SUM(CASE WHEN age BETWEEN 70 AND 79 THEN 1 ELSE 0 END) AS '70-79',
    SUM(CASE WHEN age BETWEEN 60 AND 69 THEN 1 ELSE 0 END) AS '60-69',
    SUM(CASE WHEN age BETWEEN 50 AND 59 THEN 1 ELSE 0 END) AS '50-59',
    SUM(CASE WHEN age BETWEEN 40 AND 49 THEN 1 ELSE 0 END) AS '40-49',
    SUM(CASE WHEN age BETWEEN 30 AND 39 THEN 1 ELSE 0 END) AS '30-39',
    SUM(CASE WHEN age BETWEEN 20 AND 30 THEN 1 ELSE 0 END) AS '20-29',
    SUM(CASE WHEN age BETWEEN 10 AND 19 THEN 1 ELSE 0 END) AS '10-19',
    SUM(CASE WHEN age BETWEEN 0 AND 9 THEN 1 ELSE 0 END) AS '0-9'
FROM (SELECT * FROM table) a

Я использую приведенный выше запрос для определения возрастных диапазонов, и он выводит:

+------+-------+-------+-------+-------+-------+--------+---------+---------+
| >=80 | 70-79 | 60-69 | 50-59 | 40-49 | 30-39 | 20-29  | 10-19   | 0-9     |
+------+-------+-------+-------+-------+-------+--------+---------+---------+
| 136  | 394   | 1273  | 2530  | 3298  | 15384 | 194099 | 2244405 | 9780789 |
+------+-------+-------+-------+-------+-------+--------+---------+---------+

Мне нужно преобразовать это в столбчатый формат или найти альтернативный метод группирования, учитывающий Приведенный выше запрос для генерации столбцов, а не строки значений.

желаемый результат:

+-----------+----------*
| age_range | freq     | 
+-----------+----------*
| >=80      | 136      |
+-----------+----------*
| 70-79     | 394      |
+-----------+----------*
| 60-69     | 1273     |
+-----------+----------*
| 50-59     | 2530     |
+-----------+----------*
| 40-49     | 3298     |
+-----------+----------*
| 30-39     | 15384    |
+-----------+----------*
| 20-29     | 194099   |
+-----------+----------*
| 10-19     | 2244405  |
+-----------+----------*
| 0-9       | 9780789  |
+-----------+----------*

, насколько я знаю, impala не поддерживает сводку?

Ценю любую помощь, спасибо

1 Ответ

1 голос
/ 20 марта 2020

Используйте выражение case для клавиши group by:

SELECT (CASE WHEN age >= 80 THEN '>=80',
             WHEN age BETWEEN 70 AND 79 THEN '70-79',
             WHEN age BETWEEN 60 AND 69 THEN '60-69',
             WHEN age BETWEEN 50 AND 59 THEN '50-59',
             WHEN age BETWEEN 40 AND 49 THEN '40-49',
             WHEN age BETWEEN 30 AND 39 THEN '30-39',
             WHEN age BETWEEN 20 AND 30 THEN '20-29',
             WHEN age BETWEEN 10 AND 19 THEN '10-19',
             WHEN age BETWEEN 0 AND 9 THEN '0-9'
        END) as age_group,
      COUNT(*)
FROM a
GROUP BY age_group;

РЕДАКТИРОВАТЬ:

Это проще записать как:

SELECT (CASE WHEN age >= 80 THEN '>=80',
             WHEN age >= 70 THEN '70-79',
             WHEN age >= 60 THEN '60-69',
             WHEN age >= 50 THEN '50-59',
             WHEN age >= 40 THEN '40-49',
             WHEN age >= 30 THEN '30-39',
             WHEN age >= 20 THEN '20-29',
             WHEN age >= 10 THEN '10-19',
             WHEN age >= 0 THEN '0-9'
        END) as age_group,
      COUNT(*)
FROM a
GROUP BY age_group;

CASE logi c останавливается на первом соответствующем значении.

...