按最高版本筛选行

时间:2014-10-24 11:47:34

标签: sql

我有一些数据选择。示例显示在 SQL Fiddle

我想为每个名字返回最高的myValue。

NAME    MYVALUE
A1      22
A2      22
A3      21
A4      36
A6      12
A9      5

有3行名为A6,我只想要返回最高值的行。

2 个答案:

答案 0 :(得分:1)

SELECT NAME,
       max(MYVALUE)
FROM TABLE t
GROUP BY NAME

<强> SQL Fiddle

答案 1 :(得分:1)

我发现analytic functions是实现这些结果的好方法。在你的情况下,这意味着:

SELECT
    name
    , MAX(myvalue) OVER (PARTITION BY name) AS max_name_value
FROM mytable;

分析查询IMO比单独使用GROUP BY提供更多灵活性。我链接的文章提供了以下示例:

  

我们希望看到所有部门(有员工)的列表,其中包含该部门的平均工资。以下两个查询给出   同样的结果,一个,传统的,一个没有使用   通过...分组。第二个分析查询可以更容易地扩展到   返回其他信息,例如a处的聚合   不同的分组水平。

select  d.dname
,       avg(e.sal)
from    dept d
        natural join
        emp  e
group
by      d.dname
     

使用分析功能:

select  distinct
        d.dname
,       avg(e.sal) over (partition by d.dname)  Average_Salary_in_Dept
from    dept d
        natural join
        emp  e
     

阅读此查询的分析部分,如下所示:&#39;表示每条记录   返回,选择中所有行的工资值的平均值   分区(子集,组)与当前的部门名称相同   记录的部门名称&#39;。

您还可以按多个列进行分区,以显示每个唯一名称和部门组合的最大ID,只需在PARTITION BY语句中添加更多列名,如下所示:{{1 }}