我正在尝试从回购中查询某些作业,但是我只需要具有最新开始时间的作业。我尝试过为此使用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
我可以请求帮助吗?
答案 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;
连接这样的投影似乎很奇怪,但我不了解您的业务需求。