0

我正在尝试从回购中查询一些工作,但是我只需要具有最新开始时间的工作。我已经尝试为此使用 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

我可以请求一些帮助吗?

4

1 回答 1

2

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

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

双引号标识符总是一个坏主意。除非确实有必要,否则请避免使用它们。

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

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;

像这样连接投影似乎是一件奇怪的事情,但我不了解您的业务需求。

于 2014-07-05T14:28:03.923 回答