【问题标题】:Group function with "partition by" still duplicate values具有“分区依据”的分组功能仍然重复值
【发布时间】:2019-05-23 15:07:11
【问题描述】:

我正在尝试根据第二列 (node_id) 对一列 (total_stake) 中的一些值求和,并按 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 |                         |

问题是,如何获得没有重复值的分组结果?为了更好地理解它,为什么它会重复该值?

【问题讨论】:

  • 这只对原始数据有帮助。也许你可以最小化你的查询,因为很难分析这样的查询。

标签: sql postgresql postgresql-9.1


【解决方案1】:

使用group by 确定您想要的行。如果您希望每个 node_id 有一行,请使用:

GROUP BY node_id
ORDER BY node_id;

您的额外group by 键正在生成更多行。如果您在最外层的select 中包含total_stakeprior_to,您会看到附加值。

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2019-04-25
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多