Loop / JOIN результаты динамически с помощью UNION - PullRequest
0 голосов
/ 25 июня 2018

У меня есть таблица, которая выглядит следующим образом

| id | views                                                                     | actions                                                                   |
|----|---------------------------------------------------------------------------|---------------------------------------------------------------------------|
| 1  | {"group1":{"mobile":20,"desktop":36},"group2":{"mobile":25,"desktop":41}} | {"group1":{"mobile":4,"desktop":3},"group2":{"mobile":2,"desktop":4}}     |
| 2  | {"group1":{"mobile":40,"desktop":34},"group2":{"mobile":31,"desktop":45}} | {"group1":{"mobile":21,"desktop":19},"group2":{"mobile":23,"desktop":19}} |
| 3  | {"group1":{"mobile":53,"desktop":34},"group2":{"mobile":37,"desktop":75}} | {"group1":{"mobile":17,"desktop":14},"group2":{"mobile":30,"desktop":12}} |

И я хочу, чтобы мои результаты выглядели следующим образом

| product     | views group 1  | views group 2  | actions group 1 | actions group 2 | actions per view group 1 | actions per view group 2 |
|-------------|----------------|----------------|-----------------|-----------------|--------------------------|--------------------------|
| 1 (mobile)  | 20             | 25             | 4               | 2               | (D2/B2) = 0.2            | (E2/C2) = 0.08           |
| 1 (desktop) | 36             | 41             | 3               | 4               | (D3/B3) = 0.115          | (E2/C2) = 0.09           |
| 2 (mobile)  | 40             | 31             | 21              | 23              | ...                      | ...                      |
| 2 (desktop) | 34             | 45             | 19              | 19              | ...                      | ...                      |
| 1 (overall) | (B2 + B3) = 56 | (C2 + C3) = 66 | ...             | ...             | ...                      | ...                      |
| 2 (overall) | (B4 + B5) = 84 | (C4 + C5) = 76 | ...             | ...             | ...                      | ...                      |

Я могу сделать это, используя следующий запрос SQL, но яМне интересно, могу ли я сделать это более понятным или более коротким способом

SELECT
    CASE id WHEN 1 THEN '1 (mobile)' WHEN 2 THEN '2 (mobile)' END as product,
    SUM(json_extract_path_text(actions, 'group1', 'mobile') AS actions_group_1,
    SUM(json_extract_path_text(views, 'group1', 'mobile') AS views_group_1,
    SUM(json_extract_path_text(actions, 'group2', 'mobile') AS actions_group_2,
    SUM(json_extract_path_text(views, 'group2', 'mobile') AS views_group_2,
    SUM(json_extract_path_text(actions, 'group1', 'mobile')/SUM(json_extract_path_text(views, 'group1', 'mobile') AS actions_per_view_group_1 ,
    SUM(json_extract_path_text(actions, 'group2', 'mobile')/SUM(json_extract_path_text(views, 'group2', 'mobile') AS actions_per_view_group_2
FROM widget_daily_stats
WHERE id IN (1,2)
GROUP BY id

UNION

SELECT
    CASE id WHEN 1 THEN '1 (desktop)' WHEN 2 THEN '2 (desktop)' END as product,
    SUM(json_extract_path_text(actions, 'group1', 'desktop') AS actions_group_1,
    SUM(json_extract_path_text(views, 'group1', 'desktop') AS views_group_1,
    SUM(json_extract_path_text(actions, 'group2', 'desktop') AS actions_group_2,
    SUM(json_extract_path_text(views, 'group2', 'desktop') AS views_group_2,
    SUM(json_extract_path_text(actions, 'group1', 'desktop')/SUM(json_extract_path_text(views, 'group1', 'desktop') AS actions_per_view_group_1 ,
    SUM(json_extract_path_text(actions, 'group2', 'desktop')/SUM(json_extract_path_text(views, 'group2', 'desktop') AS actions_per_view_group_2
FROM widget_daily_stats
WHERE id IN (1,2)
GROUP BY id

UNION

...

У меня должен быть способ циклически перемещаться по мобильному и настольному ПК и динамически объединять результаты без необходимости явно объединять всерезультаты

1 Ответ

0 голосов
/ 26 июня 2018

Предпочтительным решением является не хранить данные в формате JSON внутри Amazon Redshift.Как вы уже видели, вам нужно использовать функцию json_extract_path_text() для извлечения отдельных элементов, что довольно медленно.

Кроме того, наличие полей, хранящихся в JSON, означает, что Redshift не может оптимизировать хранение и доступ.Redshift намного более эффективен, если данные хранятся в отдельных полях (как показано в выходных данных).

Поэтому:

  • Попробуйте загрузить данныенепосредственно в поля, а не как объекты JSON (используйте COPY from JSON Format )
  • Или загрузите данные JSON в промежуточную таблицу, а затем используйте запрос, подобный написанному выше, для извлеченияполя, а затем вставьте их в новую таблицу.Затем используйте эту новую таблицу для всех ваших запросов.Они будут работать намного эффективнее.

Извините, что этот ответ не относится конкретно к вашему вопросу UNION, но вы обнаружите, что перевод данных в более удобный формат поможет вам в их запросах..

...