case语句错误

kupeojn6  于 2021-07-27  发布在  Java
关注(0)|答案(4)|浏览(444)

我想用case语句编写一个select查询。要求以秒为单位获得col1和col2之间的时差,case语句如下:如果时差<60秒,则为low;如果diff>60,则为high end as range。
到目前为止我尝试的是:

  1. select id, ((col1-col2)*24*60)*60 as diff_secs from table;

这给了我以秒为单位的差异,这是完美的。但为了合并案例陈述,我尝试了下面的方法,但不起作用。

  1. select id, case when (((col1-col2)*24*60)*60) < 60 then low
  2. when (((col1-col2)*24*60)*60) > 60 then high
  3. then end as range
  4. from tble;
xfyts7mz

xfyts7mz1#

通过内联视图可以实现:

  1. select id,case when diff_secs < 60 then 'low'
  2. when diff_secs > 60 then 'high'
  3. end as Range
  4. from
  5. (select id, ((col1-col2)*24*60)*60 as diff_secs
  6. from table)
  7. diff_secs_data

ps:查询不能处理等于60的数据,您可能需要根据您的要求进行修改。
编辑:要查找“高”和“低”记录的计数,使用附加的内联视图进行聚合就足够了。可以有多种方式,但我更喜欢使用内联视图,因为这样可以提供更好的可读性。

  1. select Range,count(*)
  2. from
  3. (select id,case when diff_secs < 60 then 'low'
  4. when diff_secs > 60 then 'high'
  5. end as Range
  6. from
  7. (select id, ((col1-col2)*24*60)*60 as diff_secs
  8. from table)
  9. diff_secs_data) range_data
  10. group by Range;
展开查看全部
mrfwxfqh

mrfwxfqh2#

除了小的拼写错误,我想说你可以把它改为:

  1. select
  2. id,
  3. case when col1 < col2 + interval '1' minute then 'low'
  4. else 'high'
  5. end as range
  6. from tble;

参见db<>fiddle上的运行示例。

k75qkfdt

k75qkfdt3#

我认为你的代码应该有用,但我建议:

  1. (case when col1 < col2 + interval '1' minute then 'low'
  2. when col1 > col2 + interval '1' minute then 'high'
  3. end)
llycmphe

llycmphe4#

如果您确实在使用teradata(您还标记了oracle),可以使用别名将其简化:

  1. SELECT id, (((col1-col2)*24*60)*60) AS time_diff,
  2. CASE
  3. WHEN time_diff < 60 THEN 'low'
  4. WHEN time_diff > 60 THEN 'high'
  5. END AS range
  6. from tble;

您可能还希望通过向case表达式中的一个操作数添加“=”来说明时差正好为60的情况。

相关问题