【问题标题】:Aggregate rows based on MIN flag基于 MIN 标志聚合行
【发布时间】:2019-10-24 09:48:52
【问题描述】:

我认为这是一个简单的问题,但答案却让我无法理解。

示例:我有一个返回 10 行的查询,其中一些是相同的,除了最后两列是 comment 和一个数字(language-flag) .我想知道如何始终为这些半相同的行返回具有最低语言标志号的行。

我一直假设这个想法是 MIN(language-flag),但是这需要的分组过程使查询仍然返回 2 行,因为 cmets 内容不同。

我创建的示例图像在这里:

感谢任何帮助。

跟进问题:

在困惑中我忘记了为什么我最初需要问这个问题。

如果 cmets 字段恰好为空,当有相同的 COL2 具有更高的 lang-flag 时,那应该是选定的行,如果没有更高的 lang-flag 行并且 cmets 字段为空,那么就应选择空 cmets 行。

我为此案例创建了另一个示例图像:

【问题讨论】:

  • 输出中ROW2的逻辑是什么
  • 我的示例图片错误,已更新

标签: sql oracle


【解决方案1】:

在Oracle中你也可以使用group by:

select min(comments) keep (dense_rank first order by lang_flag) as comments,
       col1, col2,
       min(lang_flag) as lang_flag
from t
group by col1, col2;

如果您有大量数据,看看这三种建议方法中哪一种最快可能会很有趣。

【讨论】:

  • 我会尝试所有 3 个,然后告诉你。 :)
【解决方案2】:

您可以使用rank() 在具有相同(col1, col2) 的记录组中按lang_flag 对记录进行排名,然后过滤掉每个组的顶部记录:

select col1, col2, comments, lang_flag
from (
    select 
        t.*,
        rank() over(partition by col1, col2 order by lang_flag) rn
    from mytable t
) x
where rn = 1

【讨论】:

  • 您好,我添加了一个后续问题,您能看一下吗?
【解决方案3】:

使用相关子查询

select a.* from table_name a
where a.lang_flag=(select min(lang_flag) from table_name b 
                          where a.comments=b.comments and a.col2=b.col2)

【讨论】:

  • 您好,我添加了一个后续问题,您能看一下吗?
  • @LiamMorgan,你为什么不在同一个问题中添加它?
  • 如果你是这个意思,我已经编辑了我原来的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2021-09-26
  • 2021-08-17
  • 1970-01-01
  • 2018-12-10
相关资源
最近更新 更多