如何从Oracle SQL中的多个列中选择唯一值?

时间:2016-01-19 10:46:39

标签: sql oracle

基本上,我有下表:

ID | Amount
AA | 10
AA | 20
BB | 30
BB | 40
CC | 10
CC | 50
DD | 20
DD | 60
EE | 30
EE | 70

我需要在每个列中获取唯一条目,如下例所示:

ID | Amount
AA | 10
BB | 30
CC | 50
DD | 60
EE | 70

到目前为止,以下代码段几乎提供了我想要的内容,但first_value()可能会返回一些值,这在当前列中并不唯一:

first_value(Amount) over (partition by ID)

Distinct也没有帮助,因为它返回唯一的行,而不是其值

修改 选择顺序无关紧要

5 个答案:

答案 0 :(得分:2)

这对我有用,即使是Dimitri提到的有问题的组合。我不知道大卷的速度有多快

with ids as (
  select id, row_number() over (order by id) as rn
  from data
  group by id
), amounts as (
  select amount, row_number() over (order by amount) as rn
  from data
  group by amount
)
select i.id, a.amount
from ids i
  join amounts a on i.rn = a.rn;

SQLFiddle目前对我不起作用,这是我的测试脚本:

create table data (id varchar(10), amount integer);

insert into data values ('AA',10);
insert into data values ('AA',20);
insert into data values ('BB',30);
insert into data values ('BB',40);
insert into data values ('CC',10);
insert into data values ('CC',50);
insert into data values ('DD',20);
insert into data values ('DD',60);
insert into data values ('EE',30);
insert into data values ('EE',70);

输出:

id | amount
---+-------
AA |     10
BB |     20
CC |     30
DD |     40
EE |     50

答案 1 :(得分:0)

我建议像这样使用row_number():

select ID ,Amount
from (
   select ID ,Amount, row_number() over(partition by id order by 1) as rn
   from yourtable
     )
where rn = 1

然而,您的预期结果并不符合可折扣的订单,有些是第一个/最低的,而有些是最后的/最高的,所以我不确定要包括哪个订单。

答案 2 :(得分:0)

我的解决方案实现递归with并进行以下操作:首先 - 选择IDamount的迷你值,然后为每个下一级别搜索ID和{{的值1}},它们已经被选中(这提供了唯一性),并且在最后查询为递归级别的每个值选择1行。但这不是一个终极解决方案,因为有可能找到源数据的组合,其中查询将不起作用(我想,这样的解决方案是不可能的,至少在SQL中)。

amount

SQL Fiddle

答案 3 :(得分:0)

也许这样的事情可以解决:

WITH tx AS
     (  SELECT ROWNUM ROW_NUMBER,
               t.id,
               t.amount
          FROM test t
               INNER JOIN test t2
                   ON     t.id = t2.id
                      AND t.amount != t2.amount
      ORDER BY t.id)
SELECT tx1.id, tx1.amount
  FROM tx tx1
   LEFT JOIN tx tx2
       ON     tx1.id = tx2.id
          AND tx1.ROW_NUMBER > tx2.ROW_NUMBER
WHERE tx2.ROW_NUMBER IS NULL    

答案 4 :(得分:0)

我知道有一个优雅的解决方案!感谢我的朋友提示:

select max(ID), mAmount from (
  select ID, max(Amount) mAmount from table group by ID
)
group by mAmount;