我正在编写一条Oracle SQL语句,以获取最新日期的值。如果我的表看起来像这样:
+============+=================+
| sv_version | sv_date_applied |
+============+=================+
| 7.3.0 | 13-JUL-2014 |
+------------+-----------------+
| 7.4.0 | 13-JUL-2014 |
+------------+-----------------+..。我的SQL语句看起来像这样:
SELECT sv_version FROMtblSchemaVersion ORDER BY sv_date_applied DESC;..。我得到了:
+============+
| sv_version |
+============+
| 7.4.0 |
+------------+
| 7.3.0 |
+------------+...but当我尝试获取顶行(7.4.0)时,如下所示:
SELECT sv_version, ROWNUM FROM tblSchemaVersion WHERE ROWNUM = 1 ORDER BY sv_date_applied DESC;..。我得到了:
+============+========+
| sv_version | ROWNUM |
+============+========+
| 7.3.0 | 1 |
+------------+--------+为什么ROWNUM要更改行的顺序?我假设它会像SQL Server的TOP或MySQL的LIMIT语句一样工作?
谢谢您抽时间见我。
发布于 2014-07-16 02:16:34
它不像TOP那样工作。
Oracle在ORDER BY之前应用ROWNUM。
你需要的是
SELECT ROWNUM, sv_version FROM
(
SELECT
sv_version
FROM tblSchemaVersion
ORDER BY sv_date_applied DESC
)
WHERE ROWNUM = 1请查看此SqlFiddle以了解其工作原理
发布于 2014-07-16 02:16:39
这里的问题是,您的ROWNUM = 1谓词在ORDER BY之前应用。这句话
SELECT sv_version, ROWNUM
FROM tblSchemaVersion
WHERE ROWNUM = 1
ORDER BY sv_date_applied DESC;是说“从表中给我任意一行,我不管是哪一行。然后按sv_date_applied对我的1行结果集进行排序”。显然,这不是你想要的。您希望在排序之后应用ROWNUM谓词。所以你想要像这样的东西
SELECT sv_version
FROM (SELECT sv_version
FROM tblSchemaVersion
ORDER BY sv_date_applied DESC)
WHERE rownum = 1发布于 2014-07-16 02:38:50
您还可以使用ROW_NUMBER尝试更符合标准SQL的版本:
SELECT sv_version
FROM
(
SELECT
sv_version,
ROW_NUMBER() OVER (ORDER BY sv_date_applied DESC) rn
FROM tblSchemaVersion
)
WHERE rn = 1这样你也可以得到第二行或每组的最大行数...
https://stackoverflow.com/questions/24765274
复制相似问题