繁体   English   中英

使用MySQL中的上一个值来计算下一个字段?

[英]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表中没有诸如hab这样的列。 但是,我想使用在以前的sum(case when ~)语法中计算的hab 我记得有多种方法可以实现,但我不记得该怎么做,也正如我所说,由于英语不佳,我找不到任何相关的帖子来满足我的要求,尽管我确定这个问题已经在此处发布,即使您仅链接了它而没有详细的解释,它也很有帮助。

谢谢。

[更新]

感谢您的回答。 我只是想使用先前的值,以避免子查询,从而避免大量重复的输入,并使整个代码更具可读性。 我已经按照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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM