2

我敢肯定这很简单,但我坚持下去。我有一张这样的桌子:

Month      Period  Value
May 2013   3       e
May 2013   2       k
May 2013   1       l
April 2013 5       z
April 2013 4       w
April 2013 3       t
April 2013 2       f
April 2013 1       j

我想找到每个月最高时期的价值。对于此数据,e 表示 2013 年 5 月,z 表示 2013 年 4 月。

4

2 回答 2

3

您没有指定您使用的 RDBMS,但您可以使用子查询来获取max(period)每个月的值,然后加入您的表以获取值:

select t1.month,
  t1.period,
  t1.value
from yourtable t1
inner join
(
  select max(period) period, month
  from yourtable
  group by month
) t2
  on t1.month = t2.month
  and t1.period = t2.period;

请参阅SQL Fiddle with Demo

如果您的数据库有窗口函数,那么您可以使用它row_number()来获取结果:

select month, period, value
from 
(
  select month, period, value,
    row_number() over(partition by month order by period desc) rn
  from yourtable
) d
where rn = 1;

请参阅带有演示的 SQL Fiddle

于 2013-07-10T16:57:09.553 回答
2

应该适用于大多数 RDBMS的通用 SQL解决方案:

SELECT month, period, value
FROM   tbl t
WHERE  NOT EXISTS (
   SELECT 1 FROM tbl t1
   WHERE  t1.month = t.month
   AND    t1.period > t.period
   );

这个是Postgres 特有的,而且速度更快:

SELECT DISTINCT ON (month)
       month, period, value
FROM   tbl t
ORDER  BY month, period DESC, value DESC;

我添加value DESCORDER BY打破关系同样伟大的时期。在这种情况下,您将获得具有较大值的行。

-> SQL小提琴

于 2013-07-10T16:59:39.297 回答