Sql 在Oracle中比较同一表中的行

Sql 在Oracle中比较同一表中的行,sql,oracle,compare,Sql,Oracle,Compare,我试图找到比较同一表中的行的最佳方法。 我写了一个self-join查询,并且能够提取出不同速率的查询。现在我需要知道利率是增加了还是减少了。如果利率上升,这是一个问题。如果它减少了,那么就没有问题了 我的数据是这样的 ID DATE RATE 1010 02/02/2014 7.4 1010 03/02/2014 7.4 1010 04/02/2014 4.9 2010 02/02/2014

我试图找到比较同一表中的行的最佳方法。 我写了一个self-join查询,并且能够提取出不同速率的查询。现在我需要知道利率是增加了还是减少了。如果利率上升,这是一个问题。如果它减少了,那么就没有问题了

我的数据是这样的

ID       DATE           RATE
1010     02/02/2014      7.4
1010     03/02/2014      7.4
1010     04/02/2014      4.9
2010     02/02/2014      4.9
2010     03/02/2014      7.4
2010     04/02/2014      7.4

因此,在我的表格中,我应该能够将ID1010编码为0(无问题),将2010编码为1(问题),因为利率从2月到4月一直在上升。

您可以通过选择..案例来实现这一点

select case when a.rate > b.rate then 'issue' else 'no issue' end
from yourTable a
join yourTable b using(id)
where a.date > b.date

请参阅。

您可以通过选择..案例来实现这一点

select case when a.rate > b.rate then 'issue' else 'no issue' end
from yourTable a
join yourTable b using(id)
where a.date > b.date
请参阅。

从MyData latest中选择不同的ID
在latest.id=previous.id上提前内部连接MyData
其中较早的.date
如果您真的需要选择没有问题的,那么获取这些代码是否是一种方法?

从MyData Last中选择不同ID
在latest.id=previous.id上提前内部连接MyData
其中较早的.date

除非你真的需要选择那些没有问题的,否则这是获得它们的一种方法吗?

听起来像是
LAG()


您可能希望围绕该行抛出一个外部查询,以仅显示具有
issue=1
的行,或者可能需要一个聚合查询来检索至少具有一个具有
issue=1
的行的id,具体取决于您的实际需求。希望以上内容足以让您了解如何获得您想要的东西。

听起来像是
LAG()


您可能希望围绕该行抛出一个外部查询,以仅显示具有
issue=1
的行,或者可能需要一个聚合查询来检索至少具有一个具有
issue=1
的行的id,具体取决于您的实际需求。希望以上内容足以让您了解如何获得您想要的东西。

选择a.&当a.rate>b.rate时,选择“问题”或“无问题”结束 从表a 在a.ID=b.ID上联接表b
其中a.日期>b.日期

选择a.&,当a.rate>b.rate时,选择“问题”,否则选择“无问题” 从表a 在a.ID=b.ID上联接表b
其中a.日期>b.日期

这也会加快利率的下降。谢谢大家。如果任何一个ID存在问题,我们是否可以将所有ID编码为“问题”?这样,我就可以过滤并获取ID有问题的所有具有不同日期的记录,而不仅仅是一条或两条记录。再次感谢!这也会加快利率的下降。谢谢大家。如果任何一个ID存在问题,我们是否可以将所有ID编码为“问题”?这样,我就可以过滤并获取ID有问题的所有具有不同日期的记录,而不仅仅是一条或两条记录。再次感谢!
with sample_data as (select 1010 id, to_date('02/02/2014', 'mm/dd/yyyy') dt, 7.4 rate from dual union all
                     select 1010 id, to_date('03/02/2014', 'mm/dd/yyyy') dt, 7.4 rate from dual union all
                     select 1010 id, to_date('04/02/2014', 'mm/dd/yyyy') dt, 4.9 rate from dual union all
                     select 2010 id, to_date('02/02/2014', 'mm/dd/yyyy') dt, 4.9 rate from dual union all
                     select 2010 id, to_date('03/02/2014', 'mm/dd/yyyy') dt, 7.4 rate from dual union all
                     select 2010 id, to_date('04/02/2014', 'mm/dd/yyyy') dt, 7.4 rate from dual)
select id,
       dt,
       rate,
       case when rate > lag(rate, 1, rate) over (partition by id order by dt) then 1 else 0 end issue
from   sample_data;

        ID DT               RATE      ISSUE
---------- ---------- ---------- ----------
      1010 02/02/2014        7.4          0
      1010 03/02/2014        7.4          0
      1010 04/02/2014        4.9          0
      2010 02/02/2014        4.9          0
      2010 03/02/2014        7.4          1
      2010 04/02/2014        7.4          0