簡體   English   中英

SQL Server 2008如何通過GROUP(ing)其他列選擇帶有Value的行?

[英]SQL Server 2008 How can I SELECT rows with Value by GROUP(ing) other column?

嗨,大家好,我是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]的最后一個值,這就是我的問題。

提前致謝

聚苯乙烯
我能夠在[年]和[月]進行GROUP BY,但據我了解,當我添加[Value]列時,GROUP BY不會影響結果,因為SQL需要對值進行更多的說明要得到..

除了使用row_number() ,您還可以使用rank() 使用rank()可能會在同一年和一個月內為您提供多個值,請參閱這篇文章 因此,添加了一個group by。

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][Cost]ASC <> DESC的順序將影響排名,因此會影響結果。

由於使用的是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 |

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM