SQL 查询 - 两个计数不同的粒度

Posted

技术标签:

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

所以我有两张桌子;

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

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

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

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

很高兴提供更多细节

谢谢

【问题讨论】:

使用正确的标签@steve @Steve 嗨!这是一个要点;如果您将示例数据格式化为表格,将更容易理解您的情况。 除其他 cmets 外,还请标记您正在使用的 RDBMS,并包括您当前正在运行的完整查询以及预期结果。谢谢***.com/help/mcve 不确定如何显示表格,所以我将它们显示为图像 查看格式化帮助以了解如何将表格显示为文本:***.com/help/formatting 我还使用plaintexttools.github.io/plain-text-table 在发布前准备 ASCII 表格 【参考方案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 函数的替代方法。你能指出我正确的方向吗?谢谢

以上是关于SQL 查询 - 两个计数不同的粒度的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access SQL 查询计数不同

SQL:使用来自两个不同表的计数

SQL聚合中同一列内的多个值的不同计数

SQL 查询 - 选择不同的类别并计数

如何通过两个不同的子句同时查询两个字段的计数?

SQL查询加入不同的表和计数