如何在SQL中执行orderby?

时间:2018-03-12 13:37:20

标签: sql db2

您好我有下表

cod     desc            date
131     test1           
132     test2
133     test3
134     test4
133     test3           20180301
133     test3           20180308
131     test1           20180227
134     test4           20180305
134     test4           20180225
132     test2           20180130

我应该选择日期desc排序的空日期行 换句话说,结果应该是这样的:

cod     desc            date
133     test3
134     test4
131     test1
132     test2

sqlfiddle link

我执行的查询是

with test as (
  select t1.cod, t1.desc, t1.date
  from mytable t1 
  )
 select cod, desc, date 
 from test where date =''
 order by test.date desc

但结果不是我想要的

cod     desc            date
131     test1   
132     test2   
133     test3   
134     test4

对我而言似乎没有正确使用(order by)。

真正的问题是 当医生第一次写这个药物时,他没有注册日期,当护士把它交给患者然后它就是注册日期所以,我的问题是显示最近的药物,在我的情况下是项目由最近日期排序的空日期

我将欣赏任何我犯错误的准则

3 个答案:

答案 0 :(得分:2)

不要排除空日期,而是使用聚合来查找最大日期:

select cod, desc, max(date)
from test 
group by cod, desc
order by max(date) desc

如果您不想显示日期,大多数DBMS支持按不在“选择”列表中的列进行排序:

select cod, desc
from test 
group by cod, desc
order by max(date) desc

根据DBMS对NULL的排序方式,您可能需要添加选项lke

order by max(date) desc NULLS LAST

查看您的modified fiddle

答案 1 :(得分:0)

这引出了一个问题,即cod多次出现时您要使用的日期。这是一种方法:

select t.*
from test t
where t.date = ''  -- don't store dates as strings
order by (select max(t2.date) from test t2 where t2.cod = t.cod);

答案 2 :(得分:0)

您正尝试在空白字段上应用order by子句!!这就是你追求的吗? sqlfiddle

with test as (
  select t1.cod, t1.desc, t1.date
  from mytable t1 
  )
 select t.cod, t.desc, t.date 
 from test as t
 inner join (
     select cod
     from test where date =''
         group by cod
 )  sel
 on t.cod = sel.cod
 where t.date <> ''
 order by t.date desc