当前位置: 首页 > 面试题库 >

使用avg和分组依据的SQL查询

宫修贤
2023-03-14
问题内容

我在为MySQL编写SQL查询时遇到一些问题。我有一个具有以下结构的表:

mysql> select id, pass, val from data_r1 limit 10;
+------------+--------------+----------------+
| id         | pass         | val            |
+------------+--------------+----------------+
| DA02959106 | 5.0000000000 |  44.4007000000 |
| 08A5969201 | 1.0000000000 | 182.4100000000 |
| 08A5969201 | 2.0000000000 | 138.7880000000 |
| DA02882103 | 5.0000000000 |  44.7265000000 |
| DA02959106 | 1.0000000000 | 186.1470000000 |
| DA02959106 | 2.0000000000 | 148.2660000000 |
| DA02959106 | 3.0000000000 | 111.9050000000 |
| DA02959106 | 4.0000000000 |  76.1485000000 |
| DA02959106 | 5.0000000000 |  44.4007000000 |
| DA02959106 | 4.0000000000 |  76.6485000000 |

我想创建一个查询,该查询从表中提取以下信息:

id, AVG of 'val' for 'pass' = 1, AVG of 'val' for 'pass' = 2, etc

查询结果应如下所示:

+------------+---------+---------+---------+---------+---------+---------+---------+
| id         | val_1   | val_2   | val_3   | val_4   | val_5   | val_6   | val_7   |
+------------+---------+---------+---------+---------+---------+---------+---------+
| DA02959106 | 186.147 | 148.266 | 111.905 | 76.3985 | 44.4007 | 0       | 0       |
+------------+---------+---------+---------+---------+---------+---------+---------+

当然,每个唯一的“ id”具有更多行。

我已经尝试过一些查询,例如

SELECT id, pass, AVG(val) AS val_1 FROM data_r1 WHERE pass = 1 GROUP BY id;

这将返回正确的结果,但是我必须使用“ pass”的其他可能值(最多7个)来扩展它

我尝试在AVG中使用嵌套的SELECT,但这没有用,因为我没有弄清楚如何正确地将其限制为当前的’id’。

然后,我创建了Views来表示每个查询的结果,其中“ pass” = 1,“ pass” = 2等。但是对于大多数id,“
pass”的最大值是5。当使用JOIN查询从中获取最终结果时这些视图收到的结果集为空,因为某些视图为空/没有特定“ id”的值。

有任何想法吗?


问题答案:

如果我了解您的需求,请尝试以下操作:

SELECT id, pass, AVG(val) AS val_1 
FROM data_r1 
GROUP BY id, pass;

或者,如果每个ID只需要一行,则可以执行以下操作:

SELECT d1.id,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
     WHERE d2.id = d1.id AND pass = 1) as val_1,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
     WHERE d2.id = d1.id AND pass = 2) as val_2,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
     WHERE d2.id = d1.id AND pass = 3) as val_3,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
     WHERE d2.id = d1.id AND pass = 4) as val_4,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
     WHERE d2.id = d1.id AND pass = 5) as val_5,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
     WHERE d2.id = d1.id AND pass = 6) as val_6,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
     WHERE d2.id = d1.id AND pass = 7) as val_7
from data_r1 d1
GROUP BY d1.id


 类似资料:
  • 问题内容: 我有一张标签表,想从列表中获得计数最高的标签。 样本数据如下所示 使用 让我得到正在寻找的完美数据。但是,我想对它进行组织,以使最高的标签数排在首位,并限制它仅向我发送前20个左右。 我试过了 而且我不断收到“组功能的无效使用-ErrNr 1111” 我究竟做错了什么? 我正在使用MySQL 4.1.25-Debian 问题答案: 在所有版本的MySQL中,只需在SELECT列表中为聚

  • 问题内容: 我有两个带有以下字段的表 我需要编写一个查询,其中提供了雇员的详细信息,雇员获得加薪的次数,最大加薪金额的值以及该加薪的日期。这是我到目前为止所拥有的: 除了授予最高增加额的日期外,这正确地给出了所有要求。我尝试了以下方法,但均未成功: 这给出了错误“组功能的无效使用”。有人知道我在做什么错吗? 问题答案: 您不能在where子句中执行此操作,无论是在联接条件下使用还是在联接条件下执行

  • 我希望请求一个dynamodb表,但我不知道如何使用Python2.7SDK boto3执行GROUPBY和ORDERBY。 我读了一遍又一遍的aws留档和大多数堆栈主题,但我没有找到明确的答案,因为我的请求相当复杂。 我将从我的表中获取所有项目,这些项目通过“源”具有“permaname”组,并且我将通过在DESC上创建_获得结果顺序。 这就是我如何做我的请求我现在的简单请求: 我希望有人知道答

  • 问题内容: 只是对SQL语法感到好奇。所以如果我有 这将是不正确的,因为 真的应该是 但是为什么我们不能仅仅为了方便而使用前者呢? 问题答案: 就像按以下顺序执行查询一样实现SQL: FROM子句 WHERE子句 GROUP BY子句 HAVING子句 SELECT子句 ORDER BY子句 对于大多数关系数据库系统,此顺序说明了哪些名称(列或别名)有效,因为它们必须在上一步中引入。 因此,在Or

  • 问题内容: 我有以下SQL: 输出如下: 我希望能够仅获取一个代码并获得最近的距离。所以我希望它返回这个: 我最初有这样的东西: 如果我不想获得与最小距离相关联的正确位置,则最小值显示效果很好。如何获取最小距离(和距离)以及正确的位置(取决于表格中插入内容的顺序,有时您可能会得到纽约距离,但夏洛特位于“位置”)。 问题答案: 为了获得正确的关联位置,您需要加入一个子选择,该子选择在外部主表中的距离

  • 问题内容: 我正在尝试转换此查询(已经可以使用) 对于Linq to SQL,但我不知道自己在做什么错。看我的尝试 我只需要对建筑物进行分组并计算每个建筑物有多少用户。 问题答案: 只需使用以下方法: