我有一个包含两列的行集:technical_id
and natural_id
。行集实际上是复杂查询的结果。假设列值之间的映射是双射的(即对于具有相同值的两行)technical_id
the natural_id
s 也相同,对于不同的technical_id
s the natural_id
s 也不同)。这(technical_id,natural_id)
由于原始查询中的联接,对在行集中不唯一。例子:
with t (technical_id, natural_id, val) as (values
(1, 'a', 1),
(1, 'a', 2),
(2, 'b', 3),
(2, 'b', 2),
(3, 'c', 0),
(3, 'c', 1),
(4, 'd', 1)
)
不幸的是,双射仅由应用程序逻辑强制执行。这natural_id
实际上是从多个表中收集并使用coalesce
基于表达式,因此其唯一性很难通过数据库约束来强制执行。
我需要通过以下方式聚合行集的行technical_id
假设natural_id
是独特的。如果不是(例如如果元组(4, 'x', 1)
添加到示例数据中),查询应该失败。在理想的 SQL 世界中,我会使用一些假设的聚合函数:
select technical_id, only(natural_id), sum(val)
from t
group by technical_id;
我知道SQL中没有这样的功能。有其他选择或解决方法吗? Postgres 特定的解决方案也可以。
注意group by technical_id, natural_id
or select technical_id, max(natural_id)
- 尽管在快乐的情况下工作得很好 - 两者都是不可接受的(首先是因为technical_id
在所有情况下结果必须是唯一的,其次是因为该值可能是随机的并掩盖了数据不一致)。
感谢您的提示:-)
更新:预期的答案是
technical_id,v,sum
1,a,3
2,b,5
3,c,1
4,d,1
或失败时4,x,1
也存在。