数据库
首页 > 数据库> > SQL(MySQL)查询以提取多个时间范围内的聚合

SQL(MySQL)查询以提取多个时间范围内的聚合

作者:互联网

假设我有下表my_table:

+----------+------------+------------+
+ key_code + cost_value + cost_date  +
+----------+------------+------------+
+   AAAA   +       1.01 + 2015-01-05 +
+   AAAA   +       4.04 + 2015-01-10 +
+   AAAA   +       3.03 + 2015-01-15 +
+   AAAA   +       2.02 + 2015-01-20 +
+   BBBB   +       5.05 + 2015-01-05 +
+   BBBB   +       8.08 + 2015-01-10 +
+   BBBB   +       7.07 + 2015-01-15 +
+   BBBB   +       6.06 + 2015-01-20 +
+----------+------------+------------+

我可以使用以下查询为每个key_code提取最小和最大cost_values:

SELECT key_code, MIN(cost_value) AS cost_min, MAX(cost_value) AS cost_max 
FROM my_table 
GROUP BY key_code 
ORDER BY key_code;

+----------+----------+----------+
+ key_code + cost_min + cost_max +
+----------+----------+----------+
+   AAAA   +     1.01 +     4.04 +
+   BBBB   +     5.05 +     8.08 +
+----------+----------+----------+

我可以使用以下查询将最近7天(假设今天= 2015-01-21)的最小值/最大值限制为cost_values:

SELECT key_code, MIN(cost_value) AS cost_min_07, MAX(cost_value) AS cost_max_07 
FROM my_table 
WHERE cost_date >= (CURDATE() - INTERVAL 7 DAY) 
GROUP BY key_code 
ORDER BY key_code;

+----------+-------------+-------------+
+ key_code + cost_min_07 + cost_max_07 +
+----------+-------------+-------------+
+   AAAA   +        2.02 +        3.03 +
+   BBBB   +        6.06 +        7.07 +
+----------+-------------+-------------+

但是,如果我想同时提取前7天,14天和21天的最小值/最大值怎么办?我如何(最有效地)产生以下结果?我猜我在问如何对每个MIN()和MAX()对应用不同的WHERE?

+----------+-------------+-------------+-------------+-------------+-------------+-------------+
+ key_code + cost_min_07 + cost_max_07 + cost_min_14 + cost_max_14 + cost_min_21 + cost_max_21 +
+----------+-------------+-------------+-------------+-------------+-------------+-------------+
+   AAAA   +        2.02 +        3.03 +        2.02 +        4.04 +        1.01 +        4.04 +
+   BBBB   +        6.06 +        7.07 +        6.06 +        8.08 +        5.05 +        8.08 +
+----------+-------------+-------------+-------------+-------------+-------------+-------------+

解决方法:

使用条件聚合:

SELECT key_code,
       MIN(CASE WHEN cost_date >= CURDATE() - INTERVAL  7 DAY THEN cost_value END) AS cost_min_07,           
       MAX(CASE WHEN cost_date >= CURDATE() - INTERVAL  7 DAY THEN cost_value END) AS cost_max_07, 
       MIN(CASE WHEN cost_date >= CURDATE() - INTERVAL 14 DAY THEN cost_value END) AS cost_min_14,           
       MAX(CASE WHEN cost_date >= CURDATE() - INTERVAL 14 DAY THEN cost_value END) AS cost_max_14, 
       MIN(CASE WHEN cost_date >= CURDATE() - INTERVAL 21 DAY THEN cost_value END) AS cost_min_21,           
       MAX(CASE WHEN cost_date >= CURDATE() - INTERVAL 21 DAY THEN cost_value END) AS cost_max_21 
FROM my_table 
WHERE cost_date >= (CURDATE() - INTERVAL 21 DAY) 
GROUP BY key_code 
ORDER BY key_code;

标签:aggregate-functions,sql,mysql
来源: https://codeday.me/bug/20191119/2033512.html