2010-03-25 56 views
5

,我有以下數據T-SQL:使用OVER和PARTITION BY

| Item | Value | Date | 
------------------------------ 
| 1 | 10 | 01.01.2010 
| 1 | 20 | 02.01.2010 
| 1 | 30 | 03.01.2010 
| 1 | 40 | 04.01.2010 
| 1 | 50 | 05.01.2010 
| 1 | 80 | 10.01.2010 
| 2 | 30 | 04.01.2010 
| 2 | 60 | 06.01.2010 
| 2 | 70 | 07.01.2010 
| 2 | 80 | 08.01.2010 
| 2 | 100 | 09.01.2010 

和下面的語句

SELECT Item, Value, MIN(Date) OVER (PARTITION BY Item) 
FROM  Data 
WHERE Value >= 50 

而且我得到以下結果

| Item | Value | Date | 
------------------------------ 
| 1 | 50 | 05.01.2010 
| 1 | 80 | 05.01.2010 
| 2 | 60 | 06.01.2010 
| 2 | 70 | 06.01.2010 
| 2 | 80 | 06.01.2010 
| 2 | 100 | 06.01.2010 

但什麼我需要的是這個

| Item | Value | Date | 
------------------------------ 
| 1 | 10 | 05.01.2010 
| 1 | 20 | 05.01.2010 
| 1 | 30 | 05.01.2010 
| 1 | 40 | 05.01.2010 
| 1 | 50 | 05.01.2010 
| 1 | 80 | 05.01.2010 
| 2 | 30 | 06.01.2010 
| 2 | 60 | 06.01.2010 
| 2 | 70 | 06.01.2010 
| 2 | 80 | 06.01.2010 
| 2 | 100 | 06.01.2010 

是否有任何快速解決方案來獲得這一個沒有自聯接的陳述?

謝謝:)

+0

你的結果是錯誤的?我只根據你提供的數據得到。 \t 50 2010-05-01 \t 80 2010-10-01 \t 60 2010-06-01 \t 70 2010-07-01 \t 80 2010-08- 01 2 100 2010-09-01 – 2010-03-25 10:29:21

+0

噢,對不起!我糾正了它 – Torben 2010-03-25 10:32:39

+0

+1幫助我理解SQL 2008中的分區 – cbmeeks 2011-06-07 14:22:45

回答

4

沒有自我加入,試試這個:

DECLARE @YourTable table (item int,value int, Date datetime) 
INSERT @YourTable VALUES (1 , 10 , '01/01/2010') 
INSERT @YourTable VALUES (1 , 20 , '02/01/2010') 
INSERT @YourTable VALUES (1 , 30 , '03/01/2010') 
INSERT @YourTable VALUES (1 , 40 , '04/01/2010') 
INSERT @YourTable VALUES (1 , 50 , '05/01/2010') 
INSERT @YourTable VALUES (1 , 80 , '10/01/2010') 
INSERT @YourTable VALUES (2 , 30 , '04/01/2010') 
INSERT @YourTable VALUES (2 , 60 , '06/01/2010') 
INSERT @YourTable VALUES (2 , 70 , '07/01/2010') 
INSERT @YourTable VALUES (2 , 80 , '08/01/2010') 
INSERT @YourTable VALUES (2 , 100 , '09/01/2010') 


SELECT Item, Value, MIN(CASE WHEN Value >= 50 THEN Date ELSE NULL END) OVER (PARTITION BY Item) 
FROM  @YourTable 

OUTPUT:

Item  Value  
----------- ----------- ----------------------- 
1   10   2010-05-01 00:00:00.000 
1   20   2010-05-01 00:00:00.000 
1   30   2010-05-01 00:00:00.000 
1   40   2010-05-01 00:00:00.000 
1   50   2010-05-01 00:00:00.000 
1   80   2010-05-01 00:00:00.000 
2   30   2010-06-01 00:00:00.000 
2   60   2010-06-01 00:00:00.000 
2   70   2010-06-01 00:00:00.000 
2   80   2010-06-01 00:00:00.000 
2   100   2010-06-01 00:00:00.000 
Warning: Null value is eliminated by an aggregate or other SET operation. 

(11 row(s) affected) 
相關問題