这个问题可能已经被问过了,但是我一直在这里看到它出现在很多地方。
让我们看一个基本表:
[表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())实际上可能是一个记录集,而不是单个记录行。
是否有人在编写查询时不需要丰富的变量方面有丰富的经验?
很抱歉,如果已经提出并回答了这个问题。
答案 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()
到输出中。如果没有进一步说明,则可以是两者中的任何一个。