【问题标题】:How to calculate a non-inflated SUM from a denormalized table如何从非规范化表中计算非膨胀 SUM
【发布时间】:2019-12-28 13:00:26
【问题描述】:

这有点像previous question I asked。假设我有一个看起来像这样的非规范化表:

    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...
   ---------------------------------------------------------------------

我想计算每个果园的Tree_Heights的总和,所以我想得到的结果是:

Orchard_ID | sum(Tree_Height)
-------------------------------
         1 |               47
-------------------------------
         2 |               40

但是,由于非规范化,总和膨胀到:

Orchard_ID | sum(Tree_Height)
-------------------------------
         1 |              136
-------------------------------
         2 |               60

我之前提到的问题的解决方案无法在此处实现,因为我们无法通过唯一的行列进行 sum()。如何编写一个简单的查询来获得预期的结果?

【问题讨论】:

  • 根据你之前的问题,你不能不加入苹果表就做这些总和吗?
  • 不,这两个问题的重点是我正在尝试在非规范化表上进行这些聚合
  • 您是否尝试同时收集其他数据?
  • CTE 算简单吗?
  • 我正在用 Sisense 编写一个不支持 CTE 的导入查询

标签: sql postgresql denormalization


【解决方案1】:

最简单的编写方法是使用CTE,但如果您的系统不支持,您可以使用派生表。我们对每棵树使用ROW_NUMBER() 而不是Apple_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"

Demo on SQLFiddle

【讨论】:

  • 这是有道理的,但是Sisense也不支持窗口函数
  • @hov 看来 Sisense 是 PostgreSQL 的一个很小的子集! :-) 你能指出文档吗?我也许能想出办法……
  • @hov 您在上一个答案中使用什么作为“唯一行列”?
  • 对于最后一个问题,我使用了来自其他连接表的多个 id 作为一个不同的行标识符。至于 Sisense,他们的多维数据集级函数在这里:documentation.sisense.com/latest/managing-data/… 我突然想到,在手动从 postgres 数据库中导入必要的表之后,聚合函数必须在那里发生
  • 您也许可以在此处执行此操作,删除 ROW_NUMBER() 并使用该组 id 值代替 WHERE rn = 1 子句甚至类似 SUM(CASE WHEN unique_row_number condition is true THEN Tree_Height ELSE 0 END) 的内容来完全避免子查询
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 2013-01-18
  • 2012-12-31
相关资源
最近更新 更多