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

Oracle 无法仅获取每个作业的第一次出现,oracle,top-n,Oracle,Top N,我试图从回购中查询一些工作,但是我只需要最新开始时间的工作。我已经尝试过使用行编号,并为每个作业只选择行编号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 WHER

我试图从回购中查询一些工作,但是我只需要最新开始时间的工作。我已经尝试过使用行编号,并为每个作业只选择行编号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

我可以请求一些帮助吗?

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

引用列别名时,省略了不带引号的引号。因此,Oracle将其解释为关键字,
rowid
,并需要一个可以转换为rowid数据类型的表达式

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

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

and "rowID" = 1
此外,限制在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;

这样连接投影看起来很奇怪,但我不理解您的业务需求。

您的答案非常棒!我并没有真正意识到“rowid”是一个关键词,但现在我知道了。之所以需要连接,是因为我通过crontab&sqlplus每小时运行一次查询,并要求输出为csv,以便更轻松地解析它。无论如何,谢谢你的回答!