在case / when子句之前为/表重新排序表

时间:2013-11-14 12:43:45

标签: sql oracle oracle10g

我有一个查询,有些情况是When子句。

我使用函数引导(或滞后)检查其他行。

问题是,我按照表格的顺序检查它,没有订单。因此,我的结果并不总是处于良好状态。

 CASE
          WHEN Lead(s.id_location, 1, NULL) OVER (ORDER BY s.id_location) = s.id_location THEN  'at the same address '
          ELSE '\par \tab ' ||s.dir || '\par \tab '|| s.address || '\par \tab salle ' || s.lib_ || '\par \tab '|| s.etage  
        END AS adresscomplete, 

我有一个可以订购的相关日期。但  问题是错误的行可以有“在同一地址”的文本,因为我没有选择它导致(或滞后)的顺序。 所以,这可能是结果:

我的方向,我的地址我的同事......在同一个地址 要么 在同一地址....我的方向,我的地址我的salle

第二个是明显错误的

在进入我的案例之前,我可以选择按日期订购行,所以它总是第二行,它将与“在同一地址”文本一起订购。

这应该是

我的方向,我的地址我的第一次约会....在同一地址第二次约会 而不是

在同一地址日期....我的方向,我的地址我的salle第二次约会

谢谢。

1 个答案:

答案 0 :(得分:1)

看起来没问题。在显示结果记录时,请确保使用相同的顺序:

SELECT ...
  CASE 
    WHEN LAG(s.id_location) OVER (ORDER BY s.id_location) = s.id_location 
    THEN  'at the same address '
  ...
FROM ...
WHERE ...
ORDER BY s.id_location; -- <== This is necessary to show your results ordered

编辑:为什么它会引导?你希望LAG看到上一行已经有了这个地址,以便显示'在同一地址'。

编辑:要按日期(以及日期内的位置)订购,请使用以下声明。我截断日期是为了删除时间部分以防万一。

SELECT ...
  CASE 
    WHEN LAG(s.id_location) OVER (ORDER BY TRUNC(s.thedate), s.id_location) = s.id_location 
    THEN  'at the same address '
  ...
FROM ...
WHERE ...
ORDER BY TRUNC(s.thedate), s.id_location; -- <== This is necessary to show your results ordered