这个问题可能已经被问过了,但我看到它在这里出现了很多地方。
我们来看一张基本的桌子:
表A
id value attribute
1 4 yellow
2 6 green
3 5 blue 我希望创建一个查询,该查询将在MAX()中找到字段的value,然后返回它的关联属性。在这种情况下,这将是green。
考虑到我目前对SQL的了解,下面是我如何写这个的。
SELECT id, value , attribute FROM [Table A]
WHERE value IN (
SELECT MAX(value) FROM [Table A] )
ORDER BY id 这对于较大的表来说并不是最理想的,因为我至少对[Table A]进行了一次全面扫描,而且大多数设计都不会在value列上有索引。
当我们尝试在混合中添加窗口函数时,这个问题就变得更加复杂了。
我们再做一张桌子。
表B
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中正确的分组。
现在,我可以对窗口函数执行类似于上面的查询的操作。据我所知,情况会是这样的。
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() )实际上可以是一个记录集,而不是一个记录行。
有没有人在编写查询时有丰富的经验,可以做到这一点而不需要额外的变量?
如果你已经问过并回答了这个问题,我非常抱歉。
发布于 2018-08-17 19:31:00
对于第二个查询,我想您希望看到的结果通常是
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(),它们中只有一个会到达输出。如果没有进一步的规范,这可以是两者中的任何一种。
https://stackoverflow.com/questions/51901589
复制相似问题