代码之家  ›  专栏  ›  技术社区  ›  Edward

基于聚合字段的返回提取其他字段数据[[副本]

  •  0
  • Edward  · 技术社区  · 8 年前

    让我们做一个基本的表格:

    [表A]

    id value attribute 
    1   4      yellow
    2   6      green 
    3   5      blue 
    

    我想创建一个查询来查找 MAX() 实地考察 value 在里面 [Table A] 然后返回其关联属性。在这种情况下,这将是 green .

    鉴于我目前所知,以下是我将如何写这篇文章 SQL .

    SELECT id, value , attribute FROM [Table A]
    WHERE value IN (
    SELECT MAX(value) FROM [Table A] ) 
    ORDER BY id 
    

    这对于较大的表不是最佳的,因为我有完整的扫描 [表A] 价值 专栏。

    当我们尝试在混合中添加窗口函数时,这个问题变得更加复杂。

    [表二]

    id    value    attribute  id_group 
    1    4         yellow        1
    2    4         yellow        1
    3    5         blue          1 
    4    9         green         2 
    5    8         yellow        2  
    6    7         yellow        2 
    7    9         blue          3 
    8    3         yellow        3
    9    4         blue          3
    

    最大值() 整个表的值,这次我希望 最大值() 在一组 id 价值观我已经开始了,并且已经预先分配了 田野 [Table B] id_group

    SELECT id , value , attribute 
    FROM [Table B] WHERE value IN ( 
    SELECT MAX(value) OVER (PARTITION BY id_group)) 
    

    但是,这不会返回所需的结果。这是因为我们丢失了数据库中的信息 WHERE 子条款选择。我们需要把钱还回去 id_组 领域 也可从该子菜单中选择。

    显然,返回的两个字段都会从相同的字段中断开 哪里

    当然,在某些情况下,聚合记录(在本例中为MAX())实际上可能是一个记录集,而不是单个记录行。

    非常抱歉,如果这已经被问到和回答了。

    1 回复  |  直到 8 年前
        1
  •  0
  •   sticky bit    8 年前

    对于您的第二个查询,我猜您也希望看到结果

    SELECT id,
           value,
           attribute,
           group_id
           FROM (SELECT id,
                        value,
                        attribute,
                        group_id,
                        rank() OVER (PARTITION BY id_group
                                     ORDER BY value DESC) r
                        FROM [Table B]) x
           WHERE r = 1;
    

    或

    SELECT id,
           value,
           attribute,
           group_id
           FROM (SELECT id,
                        value,
                        attribute,
                        group_id,
                        row_number() OVER (PARTITION BY id_group
                                           ORDER BY value DESC) r
                        FROM [Table B])
           WHERE r = 1;
    

    两者的区别在于,使用 rank() 将输出领带。如果有两行具有相同的最高值,那么它们都将被输出。使用 row_number() 他们中只有一个能达到输出。无需进一步说明,这可以是两种情况中的任何一种。