【问题标题】:Effectively joining aggregated data back to raw data in order to trace all the raw data that was used to compute the aggregation有效地将聚合数据连接回原始数据,以跟踪用于计算聚合的所有原始数据
【发布时间】:2017-07-18 15:01:57
【问题描述】:

我有一些像这样的原始数据:

原始ID|姓名 |数量|聚合ID --|--------|---------|------ 1 |福 | 10 |空值 2 |福 | 20 |空值 3 |福 | 30 |空值 4 |酒吧 | 40 |空值 5 |酒吧 | 50 |空值 6 |酒吧 | 60 |空值

我想汇总它们:

SELECT name, sum(quantity)
FROM foobar
GROUP BY name

并将这些结果存储在某处:

聚合ID|姓名 |数量 --|--------|------ 1 |福 | 60 2 |酒吧 | 150

我的目标是能够跟踪原始表中的哪些记录用于计算聚合表中的聚合。换句话说,我想将原始表中foo 的所有AggId 值更新为1,并将原始表中bar 的所有AggId 值更新为2

目前,我正在将聚合返回到分组列上的原始数据,以查找哪些aggIds 与哪些rawIds 相关联:

SELECT a.aggI r.rawId
FROM agg a JOIN raw r ON (a.name = r.name)

有没有更好的方法来做到这一点?例如,也许通过解析函数?

SELECT rawId, name, quantity, 
    SUM(quantity) OVER (PARTITION BY name) grouped_qty
FROM raw;

结果

原始ID|姓名 |数量|分组数量 --|--------|---------|------ 1 |福 | 10 | 60 2 |福 | 20 | 60 3 |福 | 30 | 60 4 |酒吧 | 40 | 60 5 |酒吧 | 50 | 60 6 |酒吧 | 60 | 60

如果我能得到分析函数来为聚合集生成一个序列 ID,那就太好了;但我不确定这是否可能。

【问题讨论】:

  • 你的桌子有历史概念吗?在您收集聚合后,是什么阻止某人在该表中插入或更新一个值,从而导致不同的SUM
  • @Siyual 它有一些历史概念;例如有一个batch_id 列,所有的聚合也被分组在batch_id 中。需要处理的新记录总是会出现在另一个batch_id中。

标签: sql oracle


【解决方案1】:

也许这就是你想要的?

SELECT name, sum(quantity), listagg(foobar.rawid, ',')
FROM foobar
GROUP BY name;

这将包括进入每一行的原始 ID 列表。请注意,listagg() 列的长度限制为 4000 个字符。

【讨论】:

  • 他想要一个为每个名字递增的数字。
【解决方案2】:

我相信你想要 DENSE_RANK() 如果你遗漏分区,它将使用整个结果集:

SELECT rawId, name, quantity, 
    SUM(quantity) OVER (PARTITION BY name) grouped_qty,
    DENSE_RANK() OVER (ORDER BY name) as name_rank
FROM raw;

更多信息:https://msdn.microsoft.com/en-us/library/ms189798.aspx

【讨论】:

  • 问题用 Oracle 标记 - 也许您应该链接到 Oracle documentation 而不是 SQL 服务器。
  • @MT0 -- 如果您知道同样清楚的 oracle 文档,请更改它。这是我发现的不同窗口函数的最佳解释之一。两个平台都基于相同的 SQL 标准,因此应该是相同的。
猜你喜欢
  • 2011-06-29
  • 2021-12-28
  • 2021-08-23
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
相关资源
最近更新 更多