Групповая функция с разделением по-прежнему дублирующихся значений - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь суммировать некоторые значения из одного столбца (total_stake) на основе второго столбца (node_id) и группировать результаты по node_id. Прямо сейчас он суммирует все идеально, но это все еще повторяющиеся строки с тем же значением node_id и суммированным значением, и я не до конца понимаю, почему.

Вот мой запрос:

WITH events AS (
    SELECT n.id as node_id, n.event_time FROM nodes n
)
SELECT
    node_id,
    sum(total) FILTER (WHERE prior_to=0 OR prior_to=2) OVER (PARTITION BY node_id) as node_total_previous_days,
    sum(total) FILTER (WHERE prior_to=1) OVER (PARTITION BY node_id) as node_total_same_day,
    sum(total) FILTER (WHERE prior_to=2) OVER (PARTITION BY node_id) as node_total_previous_day,
FROM (
    SELECT e.node_id,
           n.total,
           CASE
               WHEN date_trunc('day', np.event_time) - INTERVAL '1 day' = date_trunc('day', np.placed_time) THEN 2
               WHEN date_trunc('day', np.event_time) - INTERVAL '1 day' > n.placed_time THEN 0
               WHEN date_trunc('day', np.event_time) = date_trunc('day', n.placed_time) THEN 1
               end as prior_to
    FROM events e
    JOIN net_parts np on np.node_id = e.node_id
    JOIN nets n ON n.id = np.net_id) as summary
GROUP BY node_id, total_stake, prior_to ORDER BY node_id;

Результат запроса:

node_id | node_total_previous_days | node_total_same_day | node_total_previous_day | 
---------+--------------------------+---------------------+-------------------------+
 6194 |                          |                     |                    3.00 |
 6187 |                          |               60.00 |                  200.00 |
 6305 |                   150.00 |              569.00 |                         |
 6305 |                   150.00 |              569.00 |                         |
 6305 |                   150.00 |              569.00 |                         |
 6305 |                   150.00 |              569.00 |                         |
 6305 |                   150.00 |              569.00 |                         |

И вопрос в том, как получить сгруппированный результат без дублированных значений? И чтобы понять это, зачем дублировать эти значения?

1 Ответ

0 голосов
/ 23 мая 2019

Используйте group by, чтобы определить нужные вам строки.Если вы хотите одну строку на node_id, используйте:

GROUP BY node_id
ORDER BY node_id;

Ваши дополнительные клавиши group by генерируют больше строк.Вы увидите дополнительные значения, если вы включите total_stake и prior_to во внешних select.

...