我试图找到在同一个表中的行之间进行比较的最佳方法。 我写了一个自我加入查询,并能够拿出费率不同的那些。现在我需要了解费率是增加还是减少。如果费率增加,这是一个问题。如果它减少了,那就没有问题了。
我的数据看起来像这样
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
所以在我的表中,我应该能够将ID 1010编码为0(无问题),将2010编码为1(问题),因为速率从feb上升到apr。
答案 0 :(得分:3)
您可以使用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
答案 1 :(得分:1)
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
除非你真的需要选择那些没有问题的方法,否则会成为获取它们的一种方法吗?
答案 2 :(得分:1)
听起来像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,具体取决于您的实际要求。希望以上内容足以让您了解如何获得所需资源。
答案 3 :(得分:0)
选择a。&amp ;,当a.rate&gt;时的情况b.rate然后问题&#39;别的&#39;没问题&#39;结束 从表a 在a.ID = b.ID上连接表b 其中a.date&gt; b.date;