如何根据其他两列的特定条件计算一列的平均值?

omjgkv6w  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(379)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

10个月前关门了。
改进这个问题
很抱歉,我的题目很复杂,我是sql新手,不知道怎么问得比这个更好。
基本上我有一个非常大的表,有很多列。我需要找到任何选定列的值的平均值,但前提是该行的id具有特定的日期。
例如,我编写了一个简单的查询来按日期查找列的平均值。。。

SELECT AVG(Col6), date
FROM Schema.Table
WHERE date = 2019

这将返回日期列中包含2019的所有日期的col6的平均值。
日期栏中有两年(2019年和2020年)。有些身份证没有2019年的数据,有些没有2020年的数据。
我想写一个查询,如果一个id有一个2020年的日期和一个2019年的日期,它基本上只给我col6的平均值,但是我不确定我该怎么做。
任何帮助都将不胜感激!

ql3eal8s

ql3eal8s1#

SELECT AVG(Col6), date
FROM Schema.Table
WHERE (date = 2019 or date = 2020), you can also group them using group by, but I guess that date is or 2019 or 2020, because it can't be at the same time both values
ve7v8dk2

ve7v8dk22#

为了检查日期是否存在于这两个年份中,可以使用内部联接,如下所示:

select a.date, avg(a.col6)
from schema.table a
join schema.table b on b.id = a.id
where a.date = 2019 and b.date = 2020
vcirk6k6

vcirk6k63#

你会用 GROUP BY date 或其他类似的分组,以分隔分组返回的行。可选 WITH ROLLUP 包括总平均数。使用 WHERE 限制平均数据。

示例:db fiddle

SELECT 
    AVG(`Col6`) AS avg_col6, 
    COALESCE(`date`, 'Total') AS date
FROM `table1`
WHERE `date` BETWEEN '2019' AND '2020' 
GROUP BY `date`
WITH ROLLUP

替代品 BETWEEN (检索范围),将使用 IN() 只限制特定日期。

WHERE `date` IN('2019', '2020')

数据

CREATE TABLE table1 (
  `Col6` INTEGER,
  `date` INTEGER
);

INSERT INTO table1
  (`Col6`, `date`)
VALUES
  ('1', '2020'),
  ('2', '2020'),
  ('1', '2019'),
  ('1', '2019'),
  ('1', '2018'),
  ('1', NULL);

结果

| avg_col6 | date  |
| -------- | ----- |
| 1.0000   | 2019  |
| 1.5000   | 2020  |
| 1.2500   | Total |

不指定 GROUP BY 这个 date 列值变得模棱两可,并且可以返回子集中的“任意值”,因此不应依赖。
服务器可以自由地从每个组中选择任何值,因此除非它们相同,否则所选择的值是不确定的,这可能不是您想要的[碳化硅]

SELECT 
    AVG(`Col6`) AS avg_col6, 
    ANY_VALUE(`date`) AS date
FROM `table1`
WHERE `date` IN('2019', '2020')

结果
注:2020年可能不会实际归还

| avg_col6 | date  |
| -------- | ----- |
| 1.2500   | 2020  |

相关问题