为啥这个窗口功能不起作用?我无法使用群组

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 之前进行此计算找到了解决方法

以上是关于为啥这个窗口功能不起作用?我无法使用群组的主要内容,如果未能解决你的问题,请参考以下文章

为啥我只打开一个窗口的功能不起作用?

为啥 livewire 数据绑定不起作用?

为啥这个(Django)“过滤器”功能不起作用?

知道为啥这个 Jquery 自动完成功能不起作用吗?

为啥这个运动检测代码不起作用?

c#7元组不起作用(roslyn编译器异常)