1

大家好,我是 SQL 的初学者,所以请多多包涵.. :)

我的问题如下。

我得到了这张桌子:

     DateTime         ID     Year    Month   Value    Cost
-------------------|------|--------|-------|-------|--------|
 1-1-2013 00:00:01 |  1   |  2013  |   1   |  30   |   90   |
 1-1-2013 00:01:01 |  1   |  2013  |   1   |  0    |   0    |
 1-1-2013 00:02:01 |  1   |  2013  |   1   |  1    |   3    |
 1-2-2013 00:00:01 |  1   |  2013  |   2   |  2    |   6    |
 1-2-2013 00:01:01 |  1   |  2013  |   2   |  3    |   9    |
 1-2-2013 00:02:01 |  1   |  2013  |   2   |  4    |   12   |
 1-3-2013 00:00:01 |  1   |  2013  |   3   |  5    |   15   |
 1-3-2013 00:01:01 |  1   |  2013  |   3   |  6    |   18   |
 1-3-2013 00:02:01 |  1   |  2013  |   3   |  7    |   21   |

现在我想要得到的是这个结果

   Year    Month   Value    Cost
|--------|-------|-------|--------|
|  2013  |   1   |  1    |   3    |
|  2013  |   2   |  4    |   12   |
|  2013  |   3   |  7    |   21   |

如您所见,我正在尝试按 [月] 和 [年] 分组,并获取每个 [月] 的最后一个 [值]。

现在,正如您从结果中可以理解的那样,我不会尝试从 [Value] 列中获取 MAX() 值,而是每个 [Month] 的最后一个值,这是我的问题..

提前致谢

PS
我能够对 [Year] 和 [Month] 进行 GROUP BY,但据我所知,当我添加 [Value] 列时,GROUP BY 不会影响结果,因为 SQL 需要对你的值进行更多规范SQL 来获取..

4

2 回答 2

1

除了使用row_number(),您还可以使用rank()。使用rank()可能会在同一年和同一月内为您提供多个值,请参阅这篇文章。因此,添加了分组依据。

SELECT
  [Year],
  [Month],
  [Value],
  [Cost]
FROM
(
  SELECT 
    [Year],
    [Month],
    [Value],
    [Cost],
    Rank() OVER (PARTITION BY [Year], [Month] ORDER BY [DateTime] DESC) AS [Rank]
  FROM [t1]
) AS [sub]
WHERE [Rank] = 1
GROUP BY 
  [Year],
  [Month],
  [Value],
  [Cost]
ORDER BY
  [Year] ASC,
  [Month] ASC

如评论中所述,这可能仍会在一个月内返回多条记录。因此,可以根据所需的功能扩展 ORDER BY 语句:

Rank() OVER (PARTITION BY [Year], [Month] ORDER BY [DateTime] DESC, [Value] DESC, [Cost] ASC) AS [Rank]

切换[Value]and[Cost]ASC<>的顺序DESC会影响排名,因此会影响结果。

于 2013-01-08T11:38:07.750 回答
0

由于您使用的是 SQL Server 2008,因此您可以使用row_number()以下命令获取结果:

select year, month, value, cost
from
(
  select year, month, value, cost,
    row_number() over(partition by year, month order by datetime desc) rn
  from yourtable
) src
where rn = 1

请参阅带有演示的 SQL Fiddle

或者您可以使用子查询来获取此信息(注意:datetime使用此版本,如果您每月有多个相同最大值的记录,那么您将返回每条记录:

select t1.year, t1.month, t1.value, t1.cost
from yourtable t1
inner join
(
  select max(datetime) datetime
  from yourtable
  group by year, month
) t2
  on t1.datetime = t2.datetime

请参阅带有演示的 SQL Fiddle

两者都给出相同的结果:

| YEAR | MONTH | VALUE | COST |
-------------------------------
| 2013 |     1 |     1 |    3 |
| 2013 |     2 |     4 |   12 |
| 2013 |     3 |     7 |   21 |
于 2013-01-08T11:23:40.107 回答