根据汇总字段的返回值提取其他字段数据。

时间:2018-08-17 19:12:46

标签: sql sql-server

这个问题可能已经被问过了,但是我一直在这里看到它出现在很多地方。

让我们看一个基本表:

[表A]

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

我想创建一个查询,该查询将在MAX()中找到字段value的{​​{1}},然后返回其关联的属性。在这种情况下,该值为[Table A]

鉴于目前我对green的了解,这是我的写法。

SQL

这对于较大的表不是最佳选择,因为我至少进行了一次SELECT id, value , attribute FROM [Table A] WHERE value IN ( SELECT MAX(value) FROM [Table A] ) ORDER BY id 全扫描,并且因为大多数设计在[Table A]列上都没有索引。

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

让我们再建一张桌子。

[表B]

value

这次,我希望将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 放在一组MAX()值上,而不是简单地获取整个表的MAX()值。我已经开始,并且已经将id中的id字段预先分配给[Table B]

中的正确分组

现在,我可以对窗口函数执行与上述查询类似的操作。据我了解,它看起来像这样。

id_group

但是,这不会返回所需的结果。这是因为我们在SELECT id , value , attribute FROM [Table B] WHERE value IN ( SELECT MAX(value) OVER (PARTITION BY id_group)) 子句子选择中丢失了信息。我们还需要从该子选择中返回与返回的MAX(value)关联的WHERE字段

很显然,从同一个子选择返回两个字段将破坏我们的id_group子句语法。

所以我的问题是这个。汇总表中的字段并返回同一记录中的字段的信息的最佳方法是什么?

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

是否有人在编写查询时不需要丰富的变量方面有丰富的经验?

很抱歉,如果已经提出并回答了这个问题。

1 个答案:

答案 0 :(得分:0)

对于第二个查询,我想您通常希望查看结果

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()到输出中。如果没有进一步说明,则可以是两者中的任何一个。