我为这个复杂的标题道歉,我是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 |