2010-03-25 57 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) 
相关问题