首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据聚合字段的返回提取附加字段数据。

根据聚合字段的返回提取附加字段数据。
EN

Stack Overflow用户
提问于 2018-08-17 19:12:46
回答 1查看 28关注 0票数 0

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

我们来看一张基本的桌子:

表A

代码语言:javascript
运行
复制
id value attribute 
1   4      yellow
2   6      green 
3   5      blue 

我希望创建一个查询,该查询将在MAX()中找到字段的value,然后返回它的关联属性。在这种情况下,这将是green

考虑到我目前对SQL的了解,下面是我如何写这个的。

代码语言:javascript
运行
复制
SELECT id, value , attribute FROM [Table A]
WHERE value IN (
SELECT MAX(value) FROM [Table A] ) 
ORDER BY id 

这对于较大的表来说并不是最理想的,因为我至少对[Table A]进行了一次全面扫描,而且大多数设计都不会在value列上有索引。

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

我们再做一张桌子。

表B

代码语言:javascript
运行
复制
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值的分组之上。我已经将[Table B]中的[Table B]字段预先分配给了id_group中正确的分组。

现在,我可以对窗口函数执行类似于上面的查询的操作。据我所知,情况会是这样的。

代码语言:javascript
运行
复制
SELECT id , value , attribute 
FROM [Table B] WHERE value IN ( 
SELECT MAX(value) OVER (PARTITION BY id_group)) 

但是,这将不会返回所需的结果。这是因为我们丢失了WHERE子句中的信息。我们还需要返回与从该子select返回的最大值(值)相关联的id_group字段。

显然,从同一个子select返回两个字段将破坏我们的WHERE子句语法。

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

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

有没有人在编写查询时有丰富的经验,可以做到这一点而不需要额外的变量?

如果你已经问过并回答了这个问题,我非常抱歉。

EN

回答 1

Stack Overflow用户

发布于 2018-08-17 19:31:00

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

代码语言:javascript
运行
复制
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;

代码语言:javascript
运行
复制
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(),它们中只有一个会到达输出。如果没有进一步的规范,这可以是两者中的任何一种。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51901589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档