Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于聚合字段的返回提取其他字段数据。_Sql_Sql Server - Fatal编程技术网

Sql 基于聚合字段的返回提取其他字段数据。

Sql 基于聚合字段的返回提取其他字段数据。,sql,sql-server,Sql,Sql Server,这个问题可能已经被问过了,但我已经看到它在很多地方出现了 让我们看一个基本表: [表A] id value attribute 1 4 yellow 2 6 green 3 5 blue id value attribute id_group 1 4 yellow 1 2 4 yellow 1 3 5 blue 1 4

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

让我们看一个基本表:

[表A]

id value attribute 
1   4      yellow
2   6      green 
3   5      blue 
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
我想创建一个查询,在
[表a]
中查找字段
值的
MAX()
,然后返回其关联属性。在这种情况下,这将是绿色的

鉴于我目前对
SQL
的了解,以下是我将如何编写这篇文章

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

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

我们再做一张桌子吧

[表B]

id value attribute 
1   4      yellow
2   6      green 
3   5      blue 
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
值。我已经将
[表B]
中的
id
字段预先分配给
id\u组中的正确分组

现在,我可以对窗口函数执行类似于上面查询的操作。据我所知,它看起来像这样

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

显然,从同一个子选择返回两个字段会破坏我们的
WHERE
子句语法

所以我的问题是。聚合表上的字段并返回同一记录上的字段信息的最佳方法是什么

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

是否有人拥有编写查询的丰富经验,而不需要额外的变量


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

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

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;

会产生


两者的区别在于,使用
rank()
将输出关系。如果有两行具有相同的最高值,那么它们都将被输出。使用
row\u number()
它们中只有一个会到达输出。如果没有进一步的规范,这可以是这两种类型中的任何一种。

输出应该是什么样的?谢谢,我忘记了rank()。