根据MIN标志汇总行

时间:2019-10-24 09:48:52

标签: sql oracle

我认为这很容易,但是答案却在逃避我。

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

我一直以为想法是MIN(language-flag),但是由于注释内容不同,因此所需的分组过程使查询仍然返回2行。

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

Example

感谢您的帮助。

后续问题:

在混乱中,我忘记了为什么我本来需要问这个问题。

如果注释字段恰好为空,则当同一COL2的lang-flag较高时,则该行应为所选行;如果没有更高的lang-flag行且comment字段为null,则仅空评论行应被选中。

我为这种情况创建了另一个示例图像:

enter image description here

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

使用相关子查询

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)

答案 2 :(得分:2)

在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;

如果您有大量数据,那么查看三种建议的方法中最快的方法可能会很有趣。