![](/img/trans.png)
[英]How to group rows based on Min value of the column in SQL Server 2008
[英]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
或者,您也可以使用子查詢來獲取此信息( 請注意:對於此版本,如果您有多個記錄且每個月的最大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
兩者給出相同的結果:
| YEAR | MONTH | VALUE | COST |
-------------------------------
| 2013 | 1 | 1 | 3 |
| 2013 | 2 | 4 | 12 |
| 2013 | 3 | 7 | 21 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.