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结束,以完全避免子查询