Sql 如何从非规范化表计算非膨胀和
这有点像是一栋房子。假设我有一个非规范化的表,它看起来像这样:Sql 如何从非规范化表计算非膨胀和,sql,postgresql,denormalization,Sql,Postgresql,Denormalization,这有点像是一栋房子。假设我有一个非规范化的表,它看起来像这样: Apple_ID | Tree_ID | Orchard_ID | Tree_Height | ...other columns... --------------------------------------------------------------------- 1 | 1 | 1 | 12 | ...other values...
Apple_ID | Tree_ID | Orchard_ID | Tree_Height | ...other columns...
---------------------------------------------------------------------
1 | 1 | 1 | 12 | ...other values...
---------------------------------------------------------------------
2 | 1 | 1 | 12 | ...other values...
---------------------------------------------------------------------
3 | 1 | 1 | 12 | ...other values...
---------------------------------------------------------------------
4 | 2 | 1 | 15 | ...other values...
---------------------------------------------------------------------
5 | 2 | 1 | 15 | ...other values...
---------------------------------------------------------------------
6 | 2 | 1 | 15 | ...other values...
---------------------------------------------------------------------
7 | 2 | 1 | 15 | ...other values...
---------------------------------------------------------------------
8 | 3 | 1 | 20 | ...other values...
---------------------------------------------------------------------
9 | 3 | 1 | 20 | ...other values...
---------------------------------------------------------------------
10 | 4 | 2 | 30 | ...other values...
---------------------------------------------------------------------
11 | 5 | 2 | 10 | ...other values...
---------------------------------------------------------------------
12 | 5 | 2 | 10 | ...other values...
---------------------------------------------------------------------
13 | 5 | 2 | 10 | ...other values...
---------------------------------------------------------------------
我想计算每个果园的树高之和,所以我想得到的结果是:
Orchard_ID | sum(Tree_Height)
-------------------------------
1 | 47
-------------------------------
2 | 40
然而,由于非规范化,总和膨胀到:
Orchard_ID | sum(Tree_Height)
-------------------------------
1 | 136
-------------------------------
2 | 60
我前面提到的问题的解决方案不能在这里实现,因为我们不能通过唯一的行-列求和。如何编写一个简单的查询以获得预期结果?编写此查询的最简单方法是使用CTE,但如果您的系统不支持CTE,则可以使用派生表。对于每棵树,我们使用苹果ID上的行数,为我们提供一个唯一的求和行:
SELECT "Orchard_ID", SUM("Tree_Height") AS Total_Height
FROM (
SELECT "Orchard_ID", "Tree_Height",
ROW_NUMBER() OVER (PARTITION BY "Orchard_ID", "Tree_ID" ORDER BY "Apple_ID") AS rn
FROM data
) d
WHERE rn = 1
GROUP BY "Orchard_ID"
输出
Orchard_ID total_height
1 47
2 40
如果您可以使用CTEs,则应这样编写:
WITH CTE AS (
SELECT "Orchard_ID", "Tree_Height",
ROW_NUMBER() OVER (PARTITION BY "Orchard_ID", "Tree_ID" ORDER BY "Apple_ID") AS rn
FROM data
)
SELECT "Orchard_ID", SUM("Tree_Height") AS Total_Height
FROM CTE
WHERE rn = 1
GROUP BY "Orchard_ID"
根据你之前的问题,你不能不加入苹果的表格就做这些算术吗,这两个问题的要点是,我试图在一个非规范化的表上进行这些聚合。你是否试图同时收集其他数据?CTE是否计算得如此简单?我正在用Sisense编写一个导入查询,它不支持CTE这很有意义,但是,Sisense不支持窗口功能either@hovSisense似乎是PostgreSQL的一个很小的子集你能指着那些文件吗?我也许能弄明白…@hov在上一个答案中,您使用了什么作为唯一的行列?对于最后一个问题,我使用了来自其他联接表的多个ID作为一个不同的行标识符。至于Sisense,他们的多维数据集级函数就在这里:我刚想到聚合函数必须在那里发生,在从postgres数据库手动导入必要的表之后,您可能可以在这里执行此操作,删除行号并使用该组id值代替WHERE rn=1子句,甚至类似于SUMCASE的内容当unique行号条件为true时,则树高ELSE 0结束,以完全避免子查询