首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除条件重复值

问删除条件重复值
EN

Stack Overflow用户
提问于 2014-11-06 12:37:56
回答 2查看 75关注 0票数 0

我在查询中使用了16个表,并试图通过应用以下新的更改来优化查询。因此,我们不能使用group或union子句,因为由于性能问题,无法在现有查询中应用。

我正在寻找分区的排名/计数/行号意味着行级解决方案,如果可能的话。

代码语言:javascript
复制
select * FROM (
SELECT 'HA' as CODE,0 AS SR FROM DUAL UNION ALL
SELECT 'HA' as CODE,0 AS SR FROM DUAL UNION ALL
SELECT 'OF' as CODE,0 AS SR FROM DUAL UNION ALL
SELECT 'AC' as CODE,1 AS SR FROM DUAL UNION ALL
SELECT 'OF' as CODE,0 AS SR FROM DUAL UNION ALL
SELECT 'OF' as CODE,1 AS SR FROM DUAL UNION ALL
SELECT 'OF' as CODE,1 AS SR FROM DUAL UNION ALL
SELECT 'XY' as CODE,1 AS SR FROM DUAL UNION ALL
SELECT 'XY' as CODE,1 AS SR FROM DUAL UNION ALL
SELECT 'HA' as CODE,1 AS SR FROM DUAL UNION ALL
SELECT 'OF' as CODE,1 AS SR FROM DUAL )
ORDER BY SR

对于上面的查询示例数据,我希望:

  1. 将所有行保存在SR=0的位置
  2. 删除代码值存在于( SR=1 )中的SR=0行

例如,包含SR=1的"AC“行是因为在SR=0中没有"AC”行,而删除带有SR=1的"HA“行是因为有一个带有SR=0的"HA”行。

这些数据所需的输出:

代码语言:javascript
复制
HA   0
OF   0
HA   0
OF   0
XY   1
XY   1
AC   1
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-06 12:56:35

您可以添加子查询和分析min()。

代码语言:javascript
复制
select code, sr
from (
  select code, sr, min(sr) over (partition by code) as min_sr
  from (
    <your query>
  )
)
where sr = 0
or (sr = 1 and min_sr = 1)
order by sr;

对于每一行,子查询将为所有行的代码获得一个额外的列,该列的SR值最低。然后,外部查询对这些行进行筛选,以便只有当该代码的最小值也为1时,才保留带有SR=1的行;也就是说,该代码在SR=0中没有行。

使用您的虚拟数据提供:

代码语言:javascript
复制
CODE         SR
---- ----------
OF            0 
OF            0 
HA            0 
HA            0 
XY            1 
XY            1 
AC            1 

演示对数据使用CTE,并在子查询中显示额外的分析-min列。

您还可以将其简化为where sr = min_sr,但将其分为两个子句可能会使逻辑和规则更加清晰。

票数 1
EN

Stack Overflow用户

发布于 2014-11-06 15:11:49

您还可以尝试以下方法,将上面的子查询放到WITH中

代码语言:javascript
复制
WITH s AS (
    SELECT 'HA' as CODE,0 AS SR FROM DUAL UNION ALL
    SELECT 'HA' as CODE,0 AS SR FROM DUAL UNION ALL
    SELECT 'OF' as CODE,0 AS SR FROM DUAL UNION ALL
    SELECT 'AC' as CODE,1 AS SR FROM DUAL UNION ALL
    SELECT 'OF' as CODE,0 AS SR FROM DUAL UNION ALL
    SELECT 'OF' as CODE,1 AS SR FROM DUAL UNION ALL
    SELECT 'OF' as CODE,1 AS SR FROM DUAL UNION ALL
    SELECT 'XY' as CODE,1 AS SR FROM DUAL UNION ALL
    SELECT 'XY' as CODE,1 AS SR FROM DUAL UNION ALL
    SELECT 'HA' as CODE,1 AS SR FROM DUAL UNION ALL
    SELECT 'OF' as CODE,1 AS SR FROM DUAL )
SELECT code, sr FROM s s1 -- 's1' is the table alias
 WHERE s1.sr = 0
    OR ( s1.sr = 1
     AND NOT EXISTS ( SELECT 1 FROM s s2 -- 's2' is the table alias
                       WHERE s2.code = s1.code
                         AND s2.sr = 0 ) )

结果:

代码语言:javascript
复制
HA  0
HA  0
OF  0
OF  0
AC  1
XY  1
XY  1

不过,对于我是否认为这比@Alex的答案更具可读性,我意见不一。但它确实避免了解析函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26779695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档