无法仅获得每个作业的第一次出现

时间:2014-07-05 14:03:55

标签: oracle top-n

我正在尝试从回购中查询某些作业,但是我只需要具有最新开始时间的作业。我尝试过为此使用ROW_NUMBER,并为每个作业仅选择第1行,但它似乎没有落空:

SELECT a.jobname||','||a.projectname||','||a.startdate||','||a.enddate||','||
  ROW_NUMBER() OVER ( PARTITION BY a.jobname ORDER BY a.startdate DESC ) AS "rowID"
FROM taskhistory a
WHERE a.jobname IS NOT NULL AND a.startdate >= (SYSDATE-1))LIMIT 1 AND rowID = 1;


ERROR at line 7:
ORA-00932: inconsistent datatypes: expected ROWID got NUMBER

我可以请求帮助吗?

1 个答案:

答案 0 :(得分:2)

您为连接的字符串"rowID"设置了别名,这是一个错误,因为它与Oracle关键字rowid冲突。这是一种特殊的数据类型,它允许我们根据物理位置识别表行。 Find out more

当您引用列别名时,您省略了双引号。因此,Oracle将其解释为关键字rowid,并期望一个可以转换为ROWID数据类型的表达式。

双引号标识符总是一个坏主意。除非真的有必要,否则请避开它们。

修复列别名将揭示代码中的逻辑错误。您将一大堆列连接在一起,包括ROW_NUMBER()函数,并调用该字符串" rowID"。显然,字符串永远不会等于一,所以这将过滤掉所有行:

and "rowID" = 1

此外,LIMIT在Oracle中无效。

您需要做的是使用子查询,例如

SELECT a.jobname||','
       ||a.projectname||','
       ||a.startdate||','
       ||a.enddate||','
       ||to_char(a.rn) as "rowID"
FROM (
    SELECT jobname
            , projectname
            , startdatem 
            , enddate, 
            , ROW_NUMBER() OVER ( PARTITION BY jobname 
                                  ORDER BY startdate DESC ) AS RN
    FROM taskhistory 
    WHERE jobname IS NOT NULL 
    AND a.startdate >= (SYSDATE-1)
    ) a
where a.RN = 1;

连接这样的投影似乎很奇怪,但我不了解您的业务需求。