Sql 基于聚合字段的返回提取其他字段数据。
这个问题可能已经被问过了,但我已经看到它在很多地方出现了 让我们看一个基本表: [表A]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
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()。