SQL аналитический запрос с количеством совпадающих активов - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь вернуть аналитический запрос для ряда метрик для определенных активов за один вызов, однако не все активы имеют каждый показатель c. Поэтому я также хочу вернуть количество совпадающих активов в расчете на метри c.

У меня есть следующая структура данных

|--- asset ---|--- date ---|--- metric1 ---|--- metric2 ---|
| abc         | 2020-04-01 | 53            | <null>        |
| abc         | 2020-04-02 | 64            | <null>        |
| def         | 2020-04-01 | 22            | 15            |
| def         | 2020-04-02 | 89            | 42            |
| ghi         | 2020-04-01 | <null>        | 8             |
| ghi         | 2020-04-02 | <null>        | 92            |
| jkl         | 2020-04-01 | <null>        | 55            |
| jkl         | 2020-04-02 | <null>        | 36            |

Результат, который я получаю, равен

|--- metric1_sum ---|--- metric2_sum ---|--- metric1_asset_count ---|--- metric2_asset_count ---|
| 228               | 248               | 2                         | 3                         |

Единственный способ, которым я могу думать, - это добавить подзапросы для каждого показателя c например,

SELECT SUM(metric1) AS "metric1_sum",
       SUM(metric2) AS "metric2_sum",
       (SELECT COUNT(DISTINCT asset) 
        FROM table 
        WHERE metric1 IS NOT NULL) AS "metric1_asset_count",
       (SELECT COUNT(DISTINCT asset) 
        FROM table 
        WHERE metric2 IS NOT NULL) AS "metric2_asset_count"
FROM table

Однако, когда я увеличу это число до слишком большого количества показателей в таблице ~ 10, запрос время резко увеличивается.

Я не эксперт по SQL, есть ли способ вернуть мне требуемые результаты в разумные сроки?

1 Ответ

1 голос
/ 14 апреля 2020

Использовать условную агрегацию:

SELECT SUM(metric1) AS metric1_sum,
       SUM(metric2) AS metric2_sum,
       count(distinct asset) filter (where metric1 is not null) as  metric1_asset_count,
       count(distinct asset) filter (where metric2 is not null) as  metric2_asset_count
FROM table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...