为啥这个窗口功能不起作用?我无法使用群组
Posted
技术标签:
【中文标题】为啥这个窗口功能不起作用?我无法使用群组【英文标题】:why isn't this window function working? I can't use a group by为什么这个窗口功能不起作用?我无法使用群组 【发布时间】:2020-03-03 00:54:44 【问题描述】:我在mysql
工作,我有这张桌子:
url x y count *
abc.com 1 1 2
abc.com 2 1 2
xyz.com 1 56 5
xyz.com 2 71 5
xyz.com 3 59 5
xyz.com 4 67 5
xyz.com 5 59 5
我正在尝试运行此代码:
count(dh.x) over(partition by dh.url)
为了得到count of 2 for url of abc.com and a count of 5 for url of xyz.com to be the denominator I divide by in my query below...
那个窗口函数嵌套在这个更大的 CTE 中:
, stdev_estimates AS (
SELECT dh.url
, CASE SUM(SQUARE(dh.x - xmean)) WHEN 0 THEN 1 ELSE SQRT(SUM(SQUARE(dh.x - xmean)) / (count(dh.x) over(partition by dh.url)) - 1) END AS xstdev
, SQRT(SUM(SQUARE(dh.y - ymean)) / (count(dh.x) over(partition by dh.url)) - 1) AS ystdev
, count(dh.x) over(partition by dh.url) 'denom'
FROM date_hits dh
INNER JOIN mean_estimates m ON m.url = dh.url
GROUP BY dh.url, m.xmean, m.ymean, dh.x, dh.y
)
select *
from stdev_estimates
但是当我尝试运行内部子选择时,我不断收到此错误:
消息 8120,第 16 级,状态 1,第 49 行 列 'date_hits.x' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
但这没有意义,因为我认为这是一种解决方法,需要为 dh.x
设置一个 group by?如果您使用聚合函数,我认为您不需要 group by。
底线是我不需要按dh.x
分组,因为当我将所有内容汇总到以下位置时,它会将我的表格分成 7 行:
url xstdev ystdev
abc.com .12345 .5679
xyz.com .23455 .79023
【问题讨论】:
我无法在您的代码中找到date_hits.x
...
@stickybit:这是date_hits
的别名
【参考方案1】:
What's within 窗口函数必须是符合外部group by
的表达式。
如果你从group by
子句中去掉dh.x
,你不能单独使用它,你需要一个聚合函数。
大概,你想替换这个:
count(dh.x) over(partition by dh.url)
与:
sum(count(dh.x)) over(partition by dh.url)
【讨论】:
但如果我 sum(count()) 那么它是对计数求和,所以我得到 abc.com 的 4 和 xyz.com 的 25 而不是 2 和 5 ..我认为计数是聚合函数 通过在 CTE 之前进行此计算找到了解决方法以上是关于为啥这个窗口功能不起作用?我无法使用群组的主要内容,如果未能解决你的问题,请参考以下文章