【问题标题】:SQL Query - Two Counts Different GranularitySQL 查询 - 两个计数不同的粒度
【发布时间】:2018-01-10 12:57:35
【问题描述】:

所以我有两张桌子;

连接在一起时(ID 上的 OUTER JOIN)看起来像这样

现在,我想创建一个统计所有事件及其对应位置的查询。鉴于上面的例子,它应该是这样的;

关键是 COUNT(事件)需要在比 COUNT(位置)更高的级别聚合。即计数(事件)是该事件整个月的总计数。计数(位置)就是事件计数,分为相关位置。

我无法让我的查询在比位置更高的级别聚合计数事件。

很高兴提供更多细节

谢谢

【问题讨论】:

  • 使用正确的标签@steve
  • @Steve 嗨!这是一个要点;如果您将示例数据格式化为表格,将更容易理解您的情况。
  • 除其他 cmets 外,还请标记您正在使用的 RDBMS,并包括您当前正在运行的完整查询以及预期结果。谢谢stackoverflow.com/help/mcve
  • 不确定如何显示表格,所以我将它们显示为图像
  • 查看格式化帮助以了解如何将表格显示为文本:stackoverflow.com/help/formatting 我还使用plaintexttools.github.io/plain-text-table 在发布前准备 ASCII 表格

标签: sql count aggregate amazon-redshift granularity


【解决方案1】:

您可以使用窗口函数来实现:

select
  t1.Month,
  t1.Event,
  t2.Location,
  count (*)
    over (partition by t1.Event) as EventCount,
  count (*)
    over (partition by t1.Event, t2.Location) as LocationCount
from Table1 t1
left join Table2 t2
  on t1.Id = t2.Id

SQLFiddle: http://sqlfiddle.com/#!6/b55b3/8

【讨论】:

  • 感谢您的回复。我得到了错误;无效操作:不支持WINDOW定义;使用 SQL 工作台连接到 Amazon Redshift
  • 是否有替代分区的方法?似乎不支持
  • 这不使用窗口函数,但如果 Amazon Redshift 中存在类似的替代方法,您应该使用它。在那里我还假设月份是加入键的一部分。 select t1.Month, t1.Event, t2.Location, (select count(1) from Table1 st1 where st1.Event = t1.Event and st1.month = t1.month ) as EventCount, count (*) LocationCount from Table1 t1 left join Table2 t2 on t1.Id = t2.Id and t1.month = t2.month group by t1.Month, t1.Event, t2.Location;
  • @RadimBača 我可以提供哪些进一步的信息?我正在使用 Amazon Redshift 和 SQL Workbench。当我运行建议的代码时,我收到错误窗口定义不受支持。您说 Redshift 中存在 Window 函数的替代方法。你能指出我正确的方向吗?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2017-07-04
相关资源
最近更新 更多