T-SQL: 使用OVER和PARTITION BY

5
我有以下数据。
 |  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

有没有一种快速的解决方案,可以在不使用自连接的情况下获得这个结果?谢谢 :)

你的结果是错误的吗?我只是根据你提供的数据进行计算。 1 50 2010-05-01 1 80 2010-10-01 2 60 2010-06-01 2 70 2010-07-01 2 80 2010-08-01 2 100 2010-09-01 - schrodinger's code
哦,是的,抱歉!我已经纠正了它。 - Torben
帮助我理解 SQL 2008 中的 over partition,加一分。 - cbmeeks
1个回答

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

输出:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接