如何从表中获得最低价值

Jac*_*ack 2 mysql sql database mysqli

问题1

对于ID_CAR,如何从表(非空)中获取最低值?例如,对于ID_CAR 1,最低值为50,对于ID_CAR 2,最低值为50;对于ID_CAR 3,最低值为300.我不需要重复,我只需要一个汽车的一个值.

ID_CAR | col_1 | col_2 | col_3 | col_4 | col_5 | col_6 

1      | null  | 250   | 300   | null  | 900   | null
2      | 100   | null  | 300   | 600   | 200   | 100
1      | 300   | 100   | 800   | 100   | 50    | 900
3      | 300   | 4000  | null  | null  | null  | null
2      | null  | null  | null  | 50    | null  | 100
4      | 400   | 900   | 500   | 700   | 800   | 500
Run Code Online (Sandbox Code Playgroud)

问题2 在此示例中,col_*中的值是天.我需要为col_date添加天数并获得最低值.例如,ID_CAR 1的最低日期是2018-01-03(col_2),ID_CAR 2的最低日期是2018-01-15(col_4).

ID_CAR | col_1 | col_2 | col_3 | col_4 | col_5 | col_6 | col_date

1      | null  | 2     | 3     | null  | 5     | null  | 2018-01-01
2      | 1     | null  | 3     | 6     | 10    | 10    | 2018-01-13
1      | 3     | 20    | 80    | 10    | 50    | 90    | 2018-01-02
3      | 30    | 40    | null  | null  | null  | null  | 2018-01-03
2      | null  | null  | null  | 5     | null  | 10    | 2018-01-10
4      | 10    | 9     | 5     | 70    | 8     | 50    | 2018-01-07
Run Code Online (Sandbox Code Playgroud)

Ind*_*ent 5

没有union你可以简单地结合最小最小功能:

select
  ID_CAR,min(least(col_1,col_2,col_3,col_4,col_5,col_6)) lowest_value
from
  table
group by
  ID_CAR
Run Code Online (Sandbox Code Playgroud)

或者如果您有null需要ifnull或有coalesce功能的价值观

select
  ID_CAR,
  min(least(
    ifnull(col_1,~0),
    ifnull(col_2,~0),
    ifnull(col_3,~0),
    ifnull(col_4,~0),
    ifnull(col_5,~0),
    ifnull(col_6,~0)
  )) as lowest_value
from
  table
group by
  ID_CAR
Run Code Online (Sandbox Code Playgroud)
  • ~0 是mysql中的最大bigint
  • 相反的功能leastgreatest
  • 相反的功能minmax;-)

适用于Mysql,Oracle,Postgres,Hive ......

问题2,这样的事情:

select
  ID_CAR,
  min(least(
    DATE_ADD(col_date, INTERVAL ifnull(col_1,0) DAY),
    DATE_ADD(col_date, INTERVAL ifnull(col_2,0) DAY),
    DATE_ADD(col_date, INTERVAL ifnull(col_3,0) DAY),
    DATE_ADD(col_date, INTERVAL ifnull(col_4,0) DAY),
    DATE_ADD(col_date, INTERVAL ifnull(col_5,0) DAY),
    DATE_ADD(col_date, INTERVAL ifnull(col_6,0) DAY)
  )) as lowest_date
from
  table
group by
  ID_CAR
Run Code Online (Sandbox Code Playgroud)

或者像这样(除非所有列都可以为null):

select
  ID_CAR,
  DATE_ADD(col_date, INTERVAL min(least(
    ifnull(col_1,~0),
    ifnull(col_2,~0),
    ifnull(col_3,~0),
    ifnull(col_4,~0),
    ifnull(col_5,~0),
    ifnull(col_6,~0)
  )) DAY) as lowest_date
from
  table
group by
  ID_CAR
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个,然后@Utsav回答`~0`看起来像是无符号BIGINT值的相同值,使得调整值​​的错误更少. (2认同)