gpt4 book ai didi

MYSQL:如何在不使用子查询的情况下将算术表达式指定为 SELECT 子句中字段的值?

转载 作者:行者123 更新时间:2023-11-29 08:32:33 25 4
gpt4 key购买 nike

这是我的查询:

SELECT DISTINCT id, stat, date, user_id
FROM data AS T1
WHERE 2.0 >= (
SELECT avg1
FROM (
SELECT stat, AVG(value) AS avg1
FROM data
WHERE date > SUBTIME(NOW(), MAKETIME(168, 0, 0))
GROUP BY stat_name) b1
WHERE stat = T1.stat
AND id = T1.id)/
(
SELECT avg2
FROM (
SELECT stat, AVG(value) AS avg2
FROM cata
WHERE date > SUBTIME(NOW(), MAKETIME(336, 0, 0))
AND date <= SUBTIME(NOW(), MAKETIME(168, 0, 0))
GROUP BY stat) b2
WHERE stat = T1.stat
AND id = T1.id)
ORDER BY id;

我的想法是创建一个统计数据表,其本周的平均值是上周平均值的两倍以上。

我的问题是这样的:我想为每个统计数据选择一个代表 MAX(本周值)- MAX(上周值)的列 diff_values,代表过去一周的增长。 (基本上,今天的统计数据条目是昨天的统计数据加上增加的数据。)如果不创建两个类似于 WHERE 子句中的子查询,我想不出一种方法来做到这一点,但这样做会缩短查询执行时间真的很长,因为数据是一个相当大的表。

有什么方法可以在现有子查询之间拆分数学吗?

最佳答案

如果我正确理解您的查询,那么您正在尝试计算本周和上周每个用户的每个统计数据的平均值。

如果是这样,以下查询会以更简单的方式执行此操作:

select stat, user_id,
avg(case when date > SUBTIME(NOW(), MAKETIME(168, 0, 0)) then value end) as thisweek,
avg(case when date > SUBTIME(NOW(), MAKETIME(336, 0, 0)) AND date <= SUBTIME(NOW(), MAKETIME(168, 0, 0)) then value end) as lastweek
from data
group by stat, user_id
having 2.0 >= thisweek / lastweek

它使用条件聚合来计算每个平均值(当时使用您的逻辑 - 我没有改变这一点)。然后它使用 having 子句进行比较。

关于MYSQL:如何在不使用子查询的情况下将算术表达式指定为 SELECT 子句中字段的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16182441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com