【问题标题】:SQL - narrowing terms by a differencing methodSQL - 通过差分方法缩小术语
【发布时间】:2018-01-23 14:48:35
【问题描述】:

我有一个我试图从中访问的 SQL 数据库,我需要的是所有术语的平均值,因为每个条目的最大值和最小值之间的差异高于某个阈值。

所以,为了利益,我们有以下内容:

+------------+------+---------+  
|    Date    | Name | Number  |  
+------------+------+---------+  
| 2017-01-03 | Dude | 1000000 |  
| 2017-01-03 | Dude | 2000000 |  
| 2017-01-04 | Dude | 7000000 |  
| 2017-01-04 | Dude | 8750000 |  
+------------+------+---------+  

我现在想取日期 2017-01-03 的平均值,但前提是那天的最大和最小数字之间的差异高于/低于 X。当然我的实际表要大得多,所以删除例如,VBA 中的数据和循环是没有帮助的。

我的理想输出是:

+------------+------+---------+  
|    Date    | Name | AVGnum  |  
+------------+------+---------+  
| 2017-01-03 | Dude | X       |  
| 2017-01-04 | Dude | Y       |  
+------------+------+---------+  

其中 X 和 Y 是数字的平均值当且仅当当天的最大值和最小值之间的差值高于指定的 X。

非常感谢!!!!

【问题讨论】:

  • 当差值不超过X时会发生什么?

标签: mysql sql sql-query-store


【解决方案1】:

类似这样的:

select date, name,
       (case when max(num) - min(num) > @X then avg(num) end) as avgnum
from t
group by date, name;

这会将NULLs放在差异不满足条件的地方。

如果要过滤掉行,请改用having

select date, name, avg(num) as avgnum
from t
group by date, name
having max(num) - min(num) > @X

【讨论】:

    【解决方案2】:

    类似:

    SELECT table.Date,
           table.Name,
           AVG(table.number)
      FROM table
     WHERE table.Date = '2017-01-03'
     GROUP BY table.Date,
           table.Name
    HAVING MAX(table.Number) - MIN(table.Number) < X
       AND MAX(table.Number) - MIN(table.Number) > X
    

    请注意,只有符合条件的数字才会被纳入 AVG 计算。

    使用“HAVING”,您可以在 GROUP BY 中使用聚合函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      相关资源
      最近更新 更多