MYSQL根据Case语句和其他行值计算列值

MYSQL根据Case语句和其他行值计算列值,mysql,case,Mysql,Case,我是MYSQL的新手,所以很抱歉问这个问题,但我不知道从哪里开始 我有一个mysql表,如下所示 表1 Record_ID Price Price_Difference New_Value 1 100 null 2 101 1 3 115 14 4 135 20 5 95 -40 6 80 -15 我要做的是添

我是MYSQL的新手,所以很抱歉问这个问题,但我不知道从哪里开始

我有一个mysql表,如下所示

表1

Record_ID   Price   Price_Difference    New_Value
1           100     null
2           101     1
3           115     14
4           135     20
5           95      -40
6           80      -15
我要做的是添加并输入null的记录1,因为没有价格差异

对于记录2,我希望'New_Value'是14的价差值除以依赖于前一记录1中价格的值

e、 g.14/@var_1

在哪里

@var_1 = (case 
when price_1 < 50 then 0.5
when price_1 between 50.001 and 100 then 1
when price_1 between 100.001 and 150 then 1.25
when price_1 between 150.001 and 150 then  1.4
....etc.
end case
@var_1=(大小写)
当价格_1<50时,则为0.5
当价格_1介于50.001和100之间时,则为1
当价格_1介于100.001和150之间时,则为1.25
当价格_1介于150.001和150之间时,则为1.4
等
终局

我想这可以在MYSQL中实现,我想我该怎么做呢?

这可以通过连接同一个表的两个别名来实现,其中一个指向当前的
记录ID
,另一个指向前一个
记录ID
,方法是在连接条件中向其添加1

只有当
记录_ID
的行被保证是连续的且没有中间的间隙时,这才有效

SELECT
  pcur.Price,
  pcur.Price_Difference, 
  CASE 
    WHEN plast.Price < 50 THEN (pcur.Price_Difference / 0.05)
    WHEN plast.Price BETWEEN 50.001 AND 100 THEN (pcur.Price_Difference / 1)
    WHEN plast.Price BETWEEN 100.001 AND 150 THEN (pcur.Price_Difference / 1.25)
    WHEN plast.Price BETWEEN 150.001 AND 200 THEN (pcur.Price_Difference / 1.4)
    ELSE 999 # don't forget your else case
  END AS var_1
FROM
  /* First aliased table is the current record */
  prices pcur
  /* Second aliased table is the previous one, whose id is one behind */
  LEFT JOIN prices plast ON (pcur.Record_ID = plast.Record_ID + 1);

这里是这个的一个演示:

这可以通过连接同一个表的两个别名来完成,其中一个指向当前的
记录ID
,另一个指向前一个
记录ID
,方法是在连接条件中向其添加1

只有当
记录_ID
的行被保证是连续的且没有中间的间隙时,这才有效

SELECT
  pcur.Price,
  pcur.Price_Difference, 
  CASE 
    WHEN plast.Price < 50 THEN (pcur.Price_Difference / 0.05)
    WHEN plast.Price BETWEEN 50.001 AND 100 THEN (pcur.Price_Difference / 1)
    WHEN plast.Price BETWEEN 100.001 AND 150 THEN (pcur.Price_Difference / 1.25)
    WHEN plast.Price BETWEEN 150.001 AND 200 THEN (pcur.Price_Difference / 1.4)
    ELSE 999 # don't forget your else case
  END AS var_1
FROM
  /* First aliased table is the current record */
  prices pcur
  /* Second aliased table is the previous one, whose id is one behind */
  LEFT JOIN prices plast ON (pcur.Record_ID = plast.Record_ID + 1);

这里有一个演示:

你的
记录ID
是否总是保证顺序有序,没有间隔?它们应该总是顺序有序的,但理论上可能有间隔,虽然在这种情况下没有。那么我下面的第二个查询应该可以工作。你的
记录ID
是否总是保证顺序有序顺序中没有间隙吗?它们应该始终是连续的,但理论上可能有间隙,虽然在本例中没有。那么我下面的第二个查询应该可以工作了。@user2676706非常欢迎,欢迎使用堆栈溢出。@user2676706非常欢迎,欢迎使用堆栈溢出。