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 查询 - 两个计数不同的粒度的主要内容,如果未能解决你的问题,请参考以下文章