Sql 每次查询时返回不同结果的ORDERBY子句
我有一个Exc表,表中有以下列Sql 每次查询时返回不同结果的ORDERBY子句,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一个Exc表,表中有以下列 TIME DATE CODE CHAR(9 BYTE) VALUE NUMBER(5,2) 表中没有序列号或主键。 由于表中没有唯一的ID,我编写了以下查询来为每一行生成唯一的编号,这是将每一行标识为唯一所需的 select time, code, value from (select time, code, value, ROW_NUMBER() over (order by time) R from EXC) where R
TIME DATE
CODE CHAR(9 BYTE)
VALUE NUMBER(5,2)
表中没有序列号或主键。
由于表中没有唯一的ID,我编写了以下查询来为每一行生成唯一的编号,这是将每一行标识为唯一所需的
select time, code, value
from (select time, code, value, ROW_NUMBER() over (order by time) R from EXC) where R > :x;
x-用于保存最后一个最大行数的变量
但是,当我第二次运行上述查询时,ORDERBY index time以不同的顺序返回具有相同时间的行。我需要从Oracle查询中获得一致的order by
请在这个问题上帮助我。试试这个:
SELECT time, code, VALUE
FROM (SELECT time, code, VALUE, ROW_NUMBER () OVER (ORDER BY time) R FROM EXC)
ORDER BY r ASC;
它按您的rownum命令输出
具有相同时间的行的不同顺序
如果时间不是唯一的,那么你需要决定如何打破关系。我们无法查看您的数据,但这至少应该是一致的:
select time,code,value, ROW_NUMBER() over (order by time, code, value) R
from EXC;
奇怪的是,您在内部查询中生成R值,但在外部查询中不使用它。如果您只想使用它对结果进行排序,则可以执行以下操作:
select time, code, value
from (
select time, code, value, ROW_NUMBER() over (order by time, code, value) R
from EXC
)
order by r;
或者只是:
select time, code, value
from EXC
order by time, code, value;
如果您确实也希望看到R值,则不需要子查询:
select time, code, value, ROW_NUMBER() over (order by time, code, value) R
from EXC
order by r;
或者甚至只使用Oracle rownum伪列:
select time, code, value, rownum R
from EXC
order by order by time, code, value;
我需要R值,以便下次使用
您可以将其与过滤器相结合,正如您所示:
select time, code, value
from (
select time, code, value, ROW_NUMBER() over (order by time, code, value) R
from EXC
)
where r > :x
order by r;
但是,如果您主要使用此功能查找最近的数据,则最好记录时间并直接对其进行过滤:
select time, code, value
from EXC
where time > :x
order by ...
当然要注意如何维护该变量。表会经常更新,所以我需要每10秒查询一次。因此,我需要R值,以便下次使用以下查询获取数据。我将使用诸如select time、code、select time中的值、code、value、order by time上的行数、EXC中的code R,其中R>:X;我将在此查询中使用上一个R值。因此,为了进行这样的查询,我应该依赖于一致的order by数据。是的,我可以使用下面的查询select time,code,value from EXC where time>:x order by。。。但问题是,假设我们正在获取行并完成查询,那么在表中插入同一时间的另一行时,我们可能会错过该行,因为我们将在下一次的查询中获取比上一次更大的行数。感谢现在多次使用上述查询,我能够看到一致的顺序数据但是我需要在R上设置一个where条件来检查R>以前获取的数据。如何做到这一点。你能给我提个建议吗。例如,当我最初查询其中有10行时。我将把这10行作为变量X,下次我将使用前面的变量在我的查询中查询rownum大于10的行。我尝试了以下查询,它似乎返回了一致的顺序。如果有任何问题,请提出建议。选择时间、代码、选择时间中的值、代码、值、按时间排序的行数、代码、EXC中的值R,其中R>:X按R排序@KMN如果您知道“X”变量的确切值,那么就可以了。你只需要确保“X”总是有必要的值。是的,我可以确保。我唯一关心的是数据检索顺序在任何时候都不应该改变。我们已经按时间、值和代码对其进行了排序,为什么在外部查询中我们要按rownum对其进行排序。不想知道它实际上是如何工作的,因为没有rownum的顺序,行的顺序是不一致的。请解释一下。