调整查询以解释if语句?

时间:2019-07-23 22:33:41

标签: sql presto

我有一个类似下面的查询,该查询基于 原始时间 列是否小于或早于 start_time 然后,它为我提供了作为时间列的第一时间,该时间将从以下日期差异计算字段中的原始时间列中减去。

表m 有两个时间列,还有一个 second_time 列,有没有一种方法可以根据 t.original_time 列小于或早于 start_time 列,然后根据 m.first_time 列用于计算字段,并且 t.original_time 列大于或晚于 m.start_time 字段,那么它将使用计算字段中的m.second_time列吗?而不是两次运行此查询?

SELECT t.id,
       t.time,
       m.first_time,
       date_diff('minute',m.first_time, t.original_time) AS Calculation
FROM table t
JOIN table m ON t.id = m.id
WHERE t.original_time < m.start_time

我正在运行的第二个查询是:

SELECT t.id,
           t.time,
           m.second_time,
           date_diff('minute',m.second_time, t.original_time) AS Calculation
    FROM table t
    JOIN table m ON t.id = m.id
    WHERE t.original_time > m.start_time

基本上不运行这两个查询,而是对其进行调整以解决这两个问题?

感谢您的时间!

2 个答案:

答案 0 :(得分:0)

我认为这是您所需要的:

如果其中一个条件小于等于或大于等于,则可能不需要Where子句。

SELECT t.id,
       t.time,
       m.first_time,
       m.second_time,
       case 
          when t.original_time < m.start_time then           
            date_diff('minute',m.first_time, t.original_time)
          else
            null
       end as calculation_less,
       case 
          when t.original_time > m.start_time then           
            date_diff('minute',m.second_time, t.original_time)
          else
            null
       end as calculation_greater   
FROM table t
JOIN table m ON t.id = m.id
WHERE t.original_time < m.start_time or 
      t.original_time > m.start_time

答案 1 :(得分:0)

您可以使用if这样操作:

SELECT t.id,
       t.time,
       if(t.original_time < m.start_time, m.first_time, m.second_time),
       date_diff('minute', if(t.original_time < m.start_time, m.first_time, m.second_time), t.original_time) AS Calculation
FROM table t
JOIN table m ON t.id = m.id
WHERE t.original_time <> m.start_time

请注意,您的查询仅考虑t.original_timem.start_time不相等的情况,因此上面的查询中的WHERE子句。