我正在处理SQL查询。查询如下:
Select
a.field1,
b.field2,
c.field3,
c.field4,
b.filed5,
a.field6,
d.field7
from
a
Inner join b on a.field1 = b.field1
right join c on b.field2 = c.field3
left join d on d.filed3 = a.field1
where some conditions;
上面的输出将是这样的:
field1 | field2 | field3 | field4 | field5 | field6 | field7
--------------------------------------------------------------
name | value1 | other1 | 1 | diff | new | 100
name1 | value2 | other2 | 1 | diff1 | new1 | 100
name2 | value3 | other3 | 2 | diff2 | new2 | 100
因此,我需要在结果中添加一个新列,以根据field7
的值对field4
求和(如果它们相同)。
在SQL中可能吗?我在这里尝试使用Group by field 4
,但收到一个错误,指出应该在分组依据中使用field1
。因此我无法获得预期的结果。
预期结果:
field1 | field2 | field3 | field4 | field5 | field6 | field7
--------------------------------------------------------------
name | value1 | other1 | 1 | diff | new | 200
some | value3 | other3 | 2 | diff2 | new2 | 100
基本上我想根据条件删除一列并求和最后一个字段。
任何建议都是有帮助的。
答案 0 :(得分:2)
您可以在查询中使用分区,根据field4创建一个单独的分区,然后求和
SELECT
z.* FROM (SELECT
a.field1,
b.field2,
c.field3,
b.filed5,
a.field6,
SUM(d.field4) OVER (PARTITION BY a.field1, b.field2, c.field3, b.filed5, a.field6) AS field7,
ROW_NUMBER() OVER (PARTITION BY c.field4 ORDER BY c.field4) AS rank FROM a INNER JOIN b
ON a.field1 = b.field1 RIGHT JOIN c
ON b.field2 = c.field3 LEFT JOIN d
ON d.filed3 = a.field1 where some conditions; ) z WHERE z.rank = 1
答案 1 :(得分:2)
要计算具有相同premium
的记录组中field7
的总和,可以使用窗口函数field4
。
要只为每组具有相同SUM(...) OVER(...)
的记录保留一条记录,可以在内部查询中使用field4
并在外部查询中过滤掉不需要的记录。请注意,您需要排序条件才能可靠地选择应在每个组中保留的记录。我选择使用ROW_NUMBER()
(根据需要更改):
您的(伪)查询应类似于:
field1
提示:您可以独立运行内部查询以查看其返回的内容(这有助于理解逻辑)。