postgresql 将每行除以子类别的合计

1l5u6lss  于 2023-03-17  发布在  PostgreSQL
关注(0)|答案(2)|浏览(103)

我有一个Postgres表,如下所示:

id | value | category
0  | 10    | a
1  | 11    | b
2  | 50    | b
3  | 20    | a

并且我希望得到以下代码(当然,最后一列中的表达式是在这里求值的):

id | value | category | weight
0  | 10    | a        | 10 / (10+20)
1  | 11    | b        | 11 / (11+50)
2  | 50    | b        | 50 / (11+50)
3  | 20    | a        | 20 / (10+20)

通过使用2个查询,您可以首先使用select category, sum(value) from table0 group by category将每个类别的总计聚合到一个临时表中,然后将原始表除以临时表(通过匹配类别)。
但是我怎样才能在Postgres中通过一个查询来完成这个任务呢?

8nuwlpux

8nuwlpux1#

您可以使用window function来实现这一点:fiddle

SELECT t1."id"
     , t1."value"
     , t1."category"
     , t1."value"::decimal / SUM(t1."value") OVER w1 AS "div_1"
FROM tab1 AS t1
WINDOW w1 AS (PARTITION BY t1."category")
ORDER BY t1."id";

| 身份证|价值|范畴|第1部分|
| - ------|- ------|- ------|- ------|
| 无|十个|项目a|0.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333|
| 1个|十一|B|0.18032786885245901639|
| 第二章|五十|B|0.81967213114754098361|
| 三个|二十个|项目a|0.6666666666666666666667|

jmp7cifd

jmp7cifd2#

希望这能帮到你
首先创建名为“t”的表

CREATE TABLE t (
  id SERIAL PRIMARY KEY,
  value Float NOT NULL,
  category CHAR(1) NOT NULL
);

将数据插入表中

INSERT INTO t (id, value, category)
VALUES (0, 10, 'a'), (1, 11, 'b'), (2, 50, 'b'), (3, 20, 'a');

表中数据

id  value   category
0   10         a
1   11         b
2   50         b
3   20         a

立即查询

SELECT t.id, t.value, t.category, t.value /  ct.total_value AS weight
FROM  t
JOIN (
  SELECT category, SUM(value) AS total_value
  FROM t
  GROUP BY category
) ct ON t.category = ct.category
ORDER BY t.id;

结果

id  value   category    weight
0   10        a         0.333333333333333
1   11        b         0.180327868852459
2   50        b         0.819672131147541
3   20        a         0.666666666666667

相关问题