我试图做类似的事情:
SELECT
a, b, c, MAX(d)
FROM
table -- table with 4 columns a, b, c and d
GROUP BY
a, b
我希望将c作为我不想分组的表中的附加值,但是区分组内的行。我的问题是GROUP BY使c看起来像组中的第一行而不是真正包含
的行d = MAX(d)
表中的。
ORDER BY应用于整个结果,因此它不是一个选项。除了过早地对表(作为子查询)进行排序然后应用分组之外,我能以其他任何方式实现这一点吗?这会在每个SQL引擎中有效吗?标准是否定义了这些行为?
EDIT1:
我测试了类似的东西:
SELECT
t.*,
MAX(d) AS v
FROM
(SELECT
a, b, c, d
FROM
table
ORDER BY
d DESC) AS t
GROUP BY
a, b
并且它有效...但我认为没有人能保证排序顺序也会应用于组行... - 也许它在MySQL中以这种方式工作,但它将如何与Oracle或PostgreSQL一起使用?
答案 0 :(得分:2)
这是ANSI SQL:
SELECT a,
b,
c,
MAX(d) over (partition by a,b) as max_d
FROM the_table
这仍将返回表中的所有行。对于返回的每一行,将重复最大值。如果您想要仅具有最大值的行,您需要将其包装在派生表中:
select a,b,c,d
from (
SELECT a,
b,
c,
d,
MAX(d) over (partition by a,b) as max_d
FROM the_table
) t
where d = max_d;
如果同一个最大值出现多次,那么将返回多行。如果您只想为每个最大值使用一行,则需要使用row_number()
答案 1 :(得分:0)
您可以使用
select x.*,y.c from
(SELECT a, b, MAX(d) as d FROM table GROUP BY a, b) x,(select c,d from table) y
where x.d = y.d