我有一个数据库表results
,其中有许多列,它显示了每分钟已计入多少个目标的运行计数。
例如
f_total_ftg # full time goals
f_total_htg # half time goals
f_total_1mg # 1 minute goals
数据库中的每个插入都有一个列f_datetime
,这是关联的时间戳。
我正在尝试获取每个目标列的平均值,然后取总体平均和最近2周的平均值并除以2。
示例:
f_avg_total_ftg_overall = 3.12
f_avg_total_ftg_last_2_weeks = 2.42
f_avg_ftg = (f_avg_total_ftg_overall + f_avg_total_ftg_last_2_weeks) / 2
我当前的解决方案是将每一列整体/过去2周分开,在我的python代码中返回一个字典,在其中进行结束计算,但这在我认为的一个查询中应该可行。
我目前拥有的是
SELECT AVG((SELECT AVG(f_total_ftg) as x FROM results WHERE f_datetime < '2020-07-01 01:30:00')) AS ft_x,
AVG((SELECT AVG(f_total_ftg) as x FROM results WHERE f_datetime between '2020-07-01 01:30:00' - INTERVAL 13 DAY AND '2020-07-01 01:30:00')) AS ft_y,
AVG((SELECT AVG(f_total_1mg) as x FROM results WHERE f_datetime < '2020-07-01 01:30:00')) AS 1m_x,
AVG((SELECT AVG(f_total_1mg) as x FROM results WHERE f_datetime between '2020-07-01 01:30:00' - INTERVAL 13 DAY AND '2020-07-01 01:30:00')) AS 1m_y,
AVG((SELECT AVG(f_total_htg) as x FROM results WHERE f_datetime < '2020-07-01 01:30:00')) AS ht_total,
AVG((SELECT AVG(f_total_htg) as x FROM results WHERE f_datetime between '2020-07-01 01:30:00' - INTERVAL 13 DAY AND '2020-07-01 01:30:00')) AS ht_last14d
FROM results
如何简化呢?
答案 0 :(得分:1)
您可以使用条件聚合来简化查询,如下所示:
SELECT
AVG(CASE WHEN f_datetime < '2020-07-01 01:30:00' THEN f_total_ftg END) AS ft_x,
AVG(CASE WHEN f_datetime BETWEEN '2020-07-01 01:30:00' - INTERVAL 13 DAY AND '2020-07-01 01:30:00' THEN f_total_ftg END) AS ft_y,
AVG(CASE WHEN f_datetime < '2020-07-01 01:30:00' THEN f_total_1mg END) AS 1m_x,
AVG(CASE WHEN f_datetime BETWEEN '2020-07-01 01:30:00' - INTERVAL 13 DAY AND '2020-07-01 01:30:00' THEN f_total_1mg END) AS 1m_y,
AVG(CASE WHEN f_datetime < '2020-07-01 01:30:00' THEN f_total_htg END) AS ht_total,
AVG(CASE WHEN f_datetime BETWEEN '2020-07-01 01:30:00' - INTERVAL 13 DAY AND '2020-07-01 01:30:00' THEN f_total_htg END) AS ht_last14d
FROM results
此外,查询可以进一步简化为:
SELECT
AVG(f_total_ftg) AS ft_x,
AVG(CASE WHEN f_datetime >= '2020-07-01 01:30:00' - INTERVAL 13 DAY THEN f_total_ftg END) AS ft_y,
AVG(f_total_1mg) AS 1m_x,
AVG(CASE WHEN f_datetime >= '2020-07-01 01:30:00' - INTERVAL 13 DAY THEN f_total_1mg END) AS 1m_y,
AVG(f_total_htg) AS ht_total,
AVG(CASE WHEN f_datetime >= '2020-07-01 01:30:00' - INTERVAL 13 DAY THEN f_total_htg END) AS ht_last14d
FROM results
WHERE f_datetime <= '2020-07-01 01:30:00'
如果您在=
表达式的不等式<= '2020-07-01 01:30:00'
中包括了CASE
。
现在您可以从中进行选择并进行计算:
SELECT ft_x, ft_Y, 1m_x, 1m_y, ht_total, ht_last14d,
(ht_total + ht_last14d) / 2,
...........................
FROM (
<the query here>
) t
我不确定(ht_total + ht_last14d) / 2
是否是您所需要的,但我认为您已经明白了。