比较 Oracle 中相同 table 中的行

Comparing between rows in same table in Oracle

我正在尝试找到比较同一 table 中各行的最佳方法。 我写了一个自连接查询,并能够提取出费率不同的查询。现在我需要查明利率是上升了还是下降了。如果利率上升,这是一个问题。如果下降了就没有问题。

我的数据是这样的

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

因此,在我的 table 中,我应该能够将 ID 1010 编码为 0(没有问题),将 2010 编码为 1(问题),因为从 2 月到 4 月汇率上升了。

您可以通过 select..case

实现此目的
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

documentation for CASE expressions

select distinct ID from MyData latest
inner join MyData earlier on latest.id = earlier.id
where earlier.date < latest.date and earlier.rate < latest.rate

除非您真的需要 select 没有问题的那些,否则这将是获得它们的一种方式?

听起来像是 LAG() 的情况:

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

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

select a.&, case when a.rate > b.rate then 'issue' else 'no issue' end 来自 table 个 在 a.ID=b.ID 上加入 table b a.date > b.date;