[英]Use previous value in MySQL to compute the next field?
如何在MySQL中使用上一个值来计算下一个值? 我无法用较差的英语来解释我的意思(任何人都可以通过查看此帖子的标题来理解我的要求吗?),所以让我在摘要中进行解释:
select
year_id,
sum(case when event_cd >= 20 then 1 else 0 end) as h,
sum(case when ab_fl = "T" then 1 else 0 end) as ab,
h/ab as ba
from events
group by year_id
在上面的代码段中,当您运行查询时,您会收到错误消息,因为events
表中没有诸如h
或ab
这样的列。 但是,我想使用在以前的sum(case when ~)
语法中计算的h
和ab
。 我记得有多种方法可以实现,但我不记得该怎么做,也正如我所说,由于英语不佳,我找不到任何相关的帖子来满足我的要求,尽管我确定这个问题已经在此处发布,即使您仅链接了它而没有详细的解释,它也很有帮助。
谢谢。
[更新]
感谢您的回答。 我只是想使用先前的值,以避免子查询,从而避免大量重复的输入,并使整个代码更具可读性。 我已经按照Mosty Mostacho的描述使用了两种方法(子查询或两次编写整个语法,只是为了计算另一个值),如果在MySQL中使用这种方法不可行或冒险,我肯定可以接受上述两种方法。 对困惑感到抱歉。
MySQL中有2种方法(顺便说一句,我已经稍微简化了查询,但仍然合法):
选项1:展开变量
SELECT
year_id,
SUM(event_cd >= 20) h,
SUM(ab_fl = "T") ab,
SUM(event_cd >= 20) / SUM(ab_fl = "T") ba
FROM events
GROUP BY year_id
选项2:使用派生表
SELECT year_id, h, ab, h / ab ba FROM (
SELECT
year_id,
SUM(event_cd >= 20) h,
SUM(ab_fl = "T") ab
FROM events
GROUP BY year_id
) s
您可能会想起第二个将运行得更快,但事实并非如此。 第一个最有可能运行得更快,因为它不需要派生表,并且可以一次解决该问题。
尝试
select * h/ab as ba from
(
select
year_id,
sum(case when event_cd >= 20 then 1 else 0 end) as h,
sum(case when ab_fl = "T" then 1 else 0 end) as ab,
from events
group by year_id)
source
更新正如@MostyMostacho在下面的注释中解释的那样,由于用户变量的评估顺序未定义,因此这不是建议的技术 。
您可以使用语法为@varname := 'value'
的MySQL变量编写查询,以将总和存储在其中,然后进行引用。
SELECT
year_id
, @h := SUM(CASE WHEN event_cd >= 20 THEN 1 ELSE 0 END) AS h
, @ab := SUM(CASE WHEN ab_fl = "T" THEN 1 ELSE 0 END) AS ab
, @h/@ab AS ba
FROM events
GROUP BY year_id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.