Найти максимум между совокупными значениями в таблице - PullRequest
0 голосов
/ 08 мая 2018

Я использую базу данных PostgreSQL и веб-приложение, встроенное в Node.js.

У меня есть таблица cases вот так:

  disease   |                country                | year |  number   |  rate
------------+---------------------------------------+------+-----------+--------
 Diphtheria | Austria                               | 1989 |    190.00 |   2.47
 Tetanus    | Austria                               | 1989 |       NaN |    NaN 
 Pertussis  | Austria                               | 1989 |      0.00 |   0.00
 Measles    | Austria                               | 1989 |       NaN |    NaN
 Mumps      | Austria                               | 1989 |      0.00 |   0.00
 Rubella    | Austria                               | 1989 |       NaN |    NaN
 Polio      | Austria                               | 1989 |       NaN |    NaN
 Diphtheria | Belgium                               | 1989 |    180.00 |   2.42
 Tetanus    | Belgium                               | 1989 |      5.00 |   0.04  
 Pertussis  | Belgium                               | 1989 |      1.00 |   0.01
 Measles    | Belgium                               | 1989 |      0.00 |   0.00
 Mumps      | Belgium                               | 1989 |   2052.00 |  50.00
 Rubella    | Belgium                               | 1989 |      0.00 |   0.00
 Polio      | Belgium                               | 1989 |       NaN |    NaN
 Diphtheria | Austria                               | 1990 |      5.00 |   0.01
 Tetanus    | Austria                               | 1990 |    152.00 |   2.41 
 Pertussis  | Austria                               | 1990 |      0.00 |   0.00
 Measles    | Austria                               | 1990 |    850.00 |   3.55
 Mumps      | Austria                               | 1990 |       NaN |    NaN
 Rubella    | Austria                               | 1990 |     55.00 |   3.00
 Polio      | Austria                               | 1990 |      0.00 |   0.00
 Diphtheria | Belgium                               | 1990 |    191.00 |   2.48
 Tetanus    | Belgium                               | 1990 |     20.00 |   2.00
 Pertussis  | Belgium                               | 1990 |      5.00 |   0.40
 Measles    | Belgium                               | 1990 |      0.00 |   0.00
 Mumps      | Belgium                               | 1990 |      0.40 |   0.02
 Rubella    | Belgium                               | 1990 |     85.00 |   6.08
 Polio      | Belgium                               | 1990 |     10.00 |   0.60
 ...        | ...                                   |  ... |       ... |    ...   

Всего имеется 8040 строк, 7 разных значений заболеваний, 32 разных значения стран и 36 разных значений года.

Я должен объединить некоторые значения, основанные на заболевании, и найти максимальное значение. Например, мне нужно объединить дифтерию, столбняк и коклюш в новое значение (называемое DTP), число (и частота) которого является суммой отдельных значений. То же самое с корью, паротитом и краснухой, которые становятся MMR. Остальные значения (полиомиелит) остаются такими же, как сейчас.

Итак, это промежуточный шаг:

  disease   |                country                | year |  number   |  rate
------------+---------------------------------------+------+-----------+--------
 DTP        | Austria                               | 1989 |    190.00 |   2.47
 MMR        | Austria                               | 1989 |      0.00 |   0.00
 Polio      | Austria                               | 1989 |       NaN |    NaN
 DTP        | Belgium                               | 1989 |    186.00 |   2.47
 MMR        | Belgium                               | 1989 |   2052.00 |  50.00
 Polio      | Belgium                               | 1989 |       NaN |    NaN
 DTP        | Austria                               | 1990 |    157.00 |   2.42
 MMR        | Austria                               | 1990 |    905.00 |   6.55
 Polio      | Austria                               | 1990 |      0.00 |   0.00
 DTP        | Belgium                               | 1990 |    216.00 |   4.88
 MMR        | Belgium                               | 1990 |     85.40 |   7.00
 Polio      | Belgium                               | 1990 |     10.00 |   0.60
 ...        | ...                                   |  ... |       ... |    ...   

Суммируя значения, я считал NaN 0.

После этого мне нужно указать максимальное значение для каждого элемента болезни, поэтому:

max DTP number =  216.00
max DTP rate = 4.88
max MMR number = 2052.00
max MMR rate = 5.00
max Polio number = 10.00
max Polio rate = 0.60

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

Как мне это сделать?

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете использовать это:

WITH intermediate_table AS
(
    SELECT 
        SUM(CASE WHEN disease IN ('Diphtheria', 'Tetanus', 'Pertussis') AND number <> 'NaN' THEN number END) AS DTP_NUMBER,
        SUM(CASE WHEN disease IN ('Diphtheria', 'Tetanus', 'Pertussis') AND rate <> 'NaN' THEN rate END) AS DTP_RATE,
        SUM(CASE WHEN disease IN ('Measles', 'Mumps', 'Rubella') AND number <> 'NaN' THEN number END) AS MMR_NUMBER,
        SUM(CASE WHEN disease IN ('Measles', 'Mumps', 'Rubella') AND rate <> 'NaN' THEN rate END) AS MMR_RATE,
        SUM(CASE WHEN disease IN ('Polio') AND number <> 'NaN' THEN number END) AS Polio_NUMBER,
        SUM(CASE WHEN disease IN ('Polio') AND rate <> 'NaN' THEN rate END) AS Polio_RATE,
        country,
        year
    FROM cases
    GROUP BY country, year
)
SELECT MAX(DTP_NUMBER) AS MAX_DTP_NUMBER,
    MAX(DTP_RATE) AS MAX_DTP_RATE,
    MAX(MMR_NUMBER) AS MAX_MMR_NUMBER,
    MAX(MMR_RATE) AS MAX_MMR_RATE,
    MAX(Polio_NUMBER) AS MAX_Polio_NUMBER,
    MAX(Polio_RATE) AS MAX_Polio_RATE
FROM intermediate_table;

При необходимости используйте ROUND в запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...