如何根据另外两列的具体情况计算一列的平均值



我为这个复杂的标题道歉,我是SQL的新手,真的不知道该怎么问它。

从本质上讲,我有一个很大的表,里面有很多列。我需要找到任何选定列的值的平均值,但前提是该行的ID具有特定日期。

例如,我编写了一个简单的查询,用于按日期查找列的平均值。。。

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

这将返回日期列中包含2019的所有日期的Col6的平均值。

日期栏中有两年(2019年和2020年(。有些ID没有2019年的数据,有些ID没有2020年的数据。

我想写一个查询,如果一个ID有2020年和2019年的日期,基本上只给我Col6的平均值,但我不确定我会怎么做。

如有任何帮助,我们将不胜感激!

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

为了检查这两年的日期是否存在,您可以使用内部联接,如:

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

您可以使用GROUP BY date或其他类似的分组来隔离分组返回的行。可选地CCD_ 2以包括总平均值。使用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 |

在不指定CCD_ 6的情况下,CCD_;任何值";在子集内,不应依赖。

服务器可以从每个组中自由选择任何值,因此除非它们相同,所选的值是不确定的,即可能不是你想要的。[原文如此]

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  |

最新更新