【问题标题】:SQL Oracle Query - Select StatementSQL Oracle 查询 - 选择语句
【发布时间】:2016-04-28 13:18:27
【问题描述】:

我有一张表格,在这张表格中,有时会有单行或重复的行具有 1 个不同的属性。此属性通常为 null 或带有值。如何编写一个选择语句以返回所有不重复的数据并选择具有该值的数据以及没有该值的数据,然后返回 null 的属性。

例如

ID   SD     FEED
0016 21AE   GF-HF   
0016 21AE   null
0017 21BE   FF-HF   
0017 21BE   null
0018 21CE   CF-HF   
0018 21CE   null
0019 21DE   null    
0019 21DE   null

应该从 select 语句返回:(无重复)

ID   SD     FEED
0016 21AE   GF-HF   
0017 21BE   FF-HF   
0018 21CE   CF-HF   
0019 21DE   null    

【问题讨论】:

  • 属性不为空时应该取哪个值?
  • 您是否已经尝试过?如果不起作用怎么办?
  • select id,sd,max(FEED) from yourtable group by id,sd
  • @MaheswaranRavisankar,这并不能解决所有问题。如果您查看上面的问题,我会尝试在没有价值的地方提取所有内容,包括 null。
  • select id, sd, max(nvl(feed, ' ')) feed from yourtable group by id, sd.

标签: sql oracle


【解决方案1】:

您可以使用聚合函数 max 和 group by

select id, sd, max(feed) 
from my_table
group by id, sd;

【讨论】:

  • 这只会返回单个最大的结果并且它不包括空值或者我错过了什么?
  • 应该也返回 null .. 最终你可以使用 nvl()
【解决方案2】:
select distinct id, sd, feed
  from (select id, sd, feed, max(feed) over(partition by id, sd) as mf from t)
 where (feed is not null and mf is not null)
    or (feed is null and mf is null)
 order by id, sd, feed

我理解,只有在不存在其他值时,您才希望 (ID, SD) 和空值的每个组合的所有不同值 FEED。您可以在analytic version 中使用min() 而不是max()

测试:

create table t ( ID varchar2(10), SD varchar2(10), FEED varchar2(10));
insert into t values (0016, '21AE', 'GF-HF' );
insert into t values (0016, '21AE', 'GF-HF' );
insert into t values (0016, '21AE', 'AF-AF' );
insert into t values (0016, '21AE', null );
insert into t values (0017, '21BE', 'FF-HF' );
insert into t values (0017, '21BE', null );
insert into t values (0018, '21CE', 'CF-HF' );
insert into t values (0018, '21CE', null );
insert into t values (0019, '21DE', null );
insert into t values (0019, '21DE', null );

ID         SD         FEED
---------- ---------- ----------
16         21AE       AF-AF
16         21AE       GF-HF
17         21BE       FF-HF
18         21CE       CF-HF
19         21DE 

【讨论】:

  • 我花了一点时间才弄明白,但这实际上很有帮助。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 2021-02-05
相关资源
最近更新 更多