比较 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
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;
我正在尝试找到比较同一 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
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;