排序的SQL组

时间:2014-04-28 08:41:47

标签: sql sorting group-by

我试图做类似的事情:

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一起使用?

2 个答案:

答案 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