基本上,我有下表:
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
也没有帮助,因为它返回唯一的行,而不是其值
修改 选择顺序无关紧要
答案 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
并进行以下操作:首先 - 选择ID
和amount
的迷你值,然后为每个下一级别搜索ID
和{{的值1}},它们已经被选中(这提供了唯一性),并且在最后查询为递归级别的每个值选择1行。但这不是一个终极解决方案,因为有可能找到源数据的组合,其中查询将不起作用(我想,这样的解决方案是不可能的,至少在SQL中)。
amount
答案 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;