【问题标题】:AVG() without groupingAVG() 没有分组
【发布时间】:2014-07-07 22:36:03
【问题描述】:

在 MySQL 中,我有这个查询/表

SELECT * 
FROM
(
    SELECT
        id,
        (SELECT MY_FUNCTION(id)) AS rating -- Function returns a float
    FROM my_table
    WHERE
    /* Very long WHERE */
) AS ratings

id              rating
----------      -------------
1               1.00
2               2.00
3               10.00
4               11.05
5               10.04

现在我尝试获得平均评分

SELECT *, AVG(rating)
FROM
(
    SELECT
        id,
        (SELECT MY_FUNCTION(id)) AS rating -- Function returns a float
    FROM my_table
    WHERE
    /* Very long WHERE */
) AS ratings

id              rating          AVG(rating)
----------      -------------   -------------
1               1.00            6,818

因为 AVG() 是一个聚合函数,所以其他行被剥离。我希望(不像here)保持这样的行,无需my_table 上进行另一次选择,因为 WHERE 过于复杂,无法执行两次。像这样:

id              rating          AVG(rating)
----------      -------------   -------------
1               1.00            6,818
2               2.00            6,818
3               10.00           6,818
4               11.05           6,818
5               10.04           6,818

我也试过这个:Using SUM() without grouping the results 但我无法让 CROSS JOIN 与表别名一起使用,或者不执行两次复杂的 WHERE 部分。

【问题讨论】:

标签: mysql sql average


【解决方案1】:

我会使用临时表。

CREATE TEMPORARY TABLE Ratings (
ID Int Not Null,
Rating Float Not Null
)
Insert Ratings (ID, Rating) 
Select ID, MyFunction(ID)
From my_table
--Where yaadddyaddd

Declare @Average float 
Select @Average = Avg(Rating) From Ratings
Select ID, Rating, @Average

【讨论】:

    【解决方案2】:

    您所说的可以用一个简单的 OAF(有序分析函数)来完成:

    SELECT foo.*
        ,AVG(rating) OVER (ORDER BY id ASC) AS rating
    FROM my_table AS foo
    WHERE bar = /* many crazy shitz */
    

    这将为您提供整个表的 AVG 函数,分布在所有行中。

    【讨论】:

    • mysql有开窗功能吗?
    • 哦,嘘,我没有看到 MySQL 部分。该死的。
    • 所以别无选择? ;) 一个临时表是可能的,但它似乎有点矫枉过正
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2012-06-28
    • 2011-03-21
    相关资源
    最近更新 更多